优化一个考勤的SQL

baiqukqdp baiqukqdp 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
最近在做一个生成考勤报表,对写的SQL语句速率感觉不满意。
表结构如下:

CREATE TABLE [Attendance]
(
[usercode] [dbo].[varchar](30) NOT NULL,
[logdate] [datetime] NOT NULL,
[mac] [dbo].[varchar](30),
[tag1] [char](1),
[tag2] [char](1),
[tag3] [char](1)
)
GO
CREATE TABLE [AttendanceTime]
(
[id] [int] NOT NULL IDENTITY(1, 1),
[ontime] [dbo].[varchar](30) NULL,
[offtime] [dbo].[varchar](30) NULL,
[iscurrent] [bit] NULL
)GO

AttendanceTime的数据:
id ontime offtime iscurrent
1 DOY 08:00:00 DOY 17:30:00 1
意思为上班时间08:00,下班时间17:30

Attendance是从文本文件BULK INSERT过来的。
文本文件原始数据为:
......
01992 20100825173022 05 1 0 2
01888 20100825173024 05 1 0 2
01888 20100825173024 05 1 0 2
20 05 1 0 2
02245 20100825173027 05 1 0 2
02285 20100825173028 05 1 0 2
......
文本文件修正后数据为:
......
01992 2010-08-25 17:30:22 05 1 0 2
01888 2010-08-25 17:30:24 05 1 0 2
01888 2010-08-25 17:30:24 05 1 0 2
02245 2010-08-25 17:30:27 05 1 0 2
02285 2010-08-25 17:30:28 05 1 0 2
......

开始插入语句:
BULK INSERT HrcmsDemo.dbo.Attendance
FROM 'C:\Att20100903.After.txt'
WITH (FIELDTERMINATOR ='\t')
GO
你可以从这里下载到此文件
我写的SQL:

WITH TotalAttendance AS(
SELECT usercode ,ontime ,CASE WHEN ontime=offtime THEN NULL ELSE offtime END offtime,COUNT(1) AS 'Count'
FROM (
SELECT a.usercode ,
(SELECT MIN(a1.logdate) FROM Attendance a1 WHERE a1.usercode=a.usercode
AND Year(a1.logdate)=Year(a.logdate) AND Month(a1.logdate)=Month(a.logdate) AND DAY(a1.logdate)=DAY(a.logdate)
) ontime ,
(SELECT MAX(a2.logdate) FROM Attendance a2 WHERE a2.usercode=a.usercode
AND Year(a2.logdate)=Year(a.logdate) AND Month(a2.logdate)=Month(a.logdate) AND DAY(a2.logdate)=DAY(a.logdate)
) offtime
FROM (SELECT usercode ,logdate FROM Attendance WHERE YEAR(logdate)='2010' and MONTH(logdate)='9' GROUP BY usercode ,logdate) AS a
) tt
GROUP BY usercode, ontime ,offtime
)
INSERT INTO ttt(usercode ,workday ,timeon ,timeoff ,ontime ,offtime)
SELECT usercode,
CONVERT(VARCHAR(10),h.ontime,120) workday,
CAST(REPLACE(a.ontime,'DOY',CONVERT(VARCHAR(10),h.ontime,120)) AS DATETIME) timeon ,
CAST(REPLACE(a.offtime,'DOY',CONVERT(VARCHAR(10),h.ontime,120)) AS DATETIME) timeoff ,h.ontime,h.offtime
FROM TotalAttendance h LEFT JOIN AttendanceTime a ON 1=1;

DECLARE @ont CHAR(5),@offt CHAR(5);
SET @ont='08:00'; SET @offt='17:30';
SELECT ''''+UserName UserName ,
''''+t.usercode usercode ,''''+workday workday,
''''+timeon timeon,''''+ontime ontime,
''''+timeoff timeoff,''''+offtime offtime ,
early ,late ,
CASE WHEN ontime IS NULL OR offtime IS NULL THEN '1' WHEN COALESCE(early,late,0) = 0 THEN '0' ELSE '1' END 'state'
FROM (
SELECT usercode ,workday ,@ont timeon ,dbo.fn_ParseTime(ontime) ontime ,@offt timeoff ,dbo.fn_ParseTime(offtime) offtime ,early ,late FROM ttt
) t
JOIN UserInfo AS ui ON t.usercode = ui.UserCode
ORDER BY t.usercode ,t.workday ;
...全文

相关推荐

ASP.NET学生考勤管理系统设计方案及实践

ASP.NET 是一个用于构建动态网页和网络应用的 Web 框架,最初由微软开发。它是.NET 框架的一部分,允许开发者使用诸如 C#、VB.NET 等语言编写服务器端代码。ASP.NET 使用基于事件的编程模型,提供了丰富的控件库以支持数据访问、身份验证、授权等多种Web开发场景。ASP.NET的核心优势在于其强大的性能和灵活性,它支持两种主要的开发模式:Web Forms和MVC(Model-View-Controller)。

陈马登Morden

Spring Boot学生考勤系统:RBAC权限+MySQL事务+SQL优化实战

考勤管理系统是典型的业务型Java Web应用,其核心涉及用户角色权限控制(RBAC)、数据库事务一致性保障、以及高频查询的SQL性能优化。本文以Spring Boot 2.7为基础框架,结合MySQL 5.7+真实建表与外键约束,详解如何通过@PreAuthorize实现细粒度接口级权限隔离,利用@Transactional确保打卡操作的原子性,并针对JOIN报表查询添加复合索引提升响应效率。技术价值体现在工程可落地性——从UML建模、ER设计到Maven多模块构建、application.yml安全配置

ELSON麦香包

基于SpringBoot+Vue的考勤系统全栈开发:从业务模型到高并发优化

企业级应用开发中,业务系统的设计与实现是核心挑战。理解如何将复杂的线下流程(如考勤管理)抽象为清晰的数据模型和业务逻辑,是软件工程的关键。其原理在于通过合理的架构设计(如前后端分离)和数据库建模,将“人、事、时、地”等要素转化为可计算、可追溯的数据实体。这一过程的技术价值在于构建出稳定、可扩展且易于维护的系统,以支撑日常运营与决策。典型的应用场景包括企业内部管理、人力资源数字化以及作为计算机专业学生的综合实践项目。本文以企业级考勤系统为例,深入剖析了其核心业务模型设计,并针对高并发打卡、数据库查询优化等工程

Huigr王

前端开发组件示例源码_f1b6a91d详解

前端开发组件示例源码_f1b6a91d,内容包含源码/脚本与使用说明文档,结构清晰、注释完整,适合学习参考与二次开发,下载解压即可查看。

鱿鱼助手

前端开发基于history.js的HTML5与HTML4浏览器兼容方案:单页应用无刷新历史状态管理技术实现-Gjl4Gf1792158475

内容概要:本文系统介绍了如何利用history.js实现单页应用(SPA)在HTML5c与HTML4浏览器间s草错发的无缝历史状态管理。通过封装原生History API并在不支持的浏览器中自动降级为哈希路由,history.js解决了因浏览器兼容性导致的后退按钮失效、URL混乱等问题。文章详细讲解了其核心机制,包括状态对象管理、自动模式切换(HTML5 pushState vs HTML4 哈希)、状态数据持久化以及针,对Safari、IE等浏\览器的兼容性修复方案,并提供了从入门到实战的完整示例,涵盖初始化、事,件监听、页面加载及性能优化技巧。;Gjl4Gf1792158475 www.gblp.net www.gsctlq.com gezhixq.cn www.greendalian.com wap.gxqnm.com

2601_97196179
评论 9
收藏 已收藏
分享
返回顶部
baiqukqdp
疑难问题 22,298 成员 121,727 内容