本帖最后由 彭家贰小姐 于 2013-7-13 10:23 编辑
1.表的建立
2.问题
- 查询员工姓名含有O的员工在昨天迟到的时长!(每天只会记一次迟到)
- SELECT T_Worker.Uid,name ,
- CASE WHEN latelong IS NULL THEN 0 ELSE latelong END latelong
- FROM dbo.T_Worker
- LEFT JOIN (SELECT * FROM dbo.T_Late WHERE latetime = CONVERT(VARCHAR(10),GETDATE()-1,120) ) AS temp ON dbo.T_Worker.Uid = temp.Uid
- WHERE name LIKE N'%荣%'
复制代码
说明: 1. 昨天 CONVERT(VARCHAR(10),GETDATE()-1,120) )
2.颜荣州 昨天没有迟到 所以要记录为 0 CASE WHEN latelong IS NULL THEN 0 ELSE latelong END
- 跟新表每个员工迟到次数为“上月迟到次数”次数之和用getdate datediff
疑问:1.T_Worker这张表的迟到次数不是应该记录总的吗?为什么要更新为上月迟到的次数呢?
2.如果一个人上个月没迟到 是不是 在T_Worker表中他的迟到次数 就为 0 ?- IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp
- SELECT T_Worker.Uid, (CASE WHEN times IS NULL THEN 0 ELSE times END )AS times
- INTO #temp
- FROM dbo.T_Worker
- LEFT JOIN (
- SELECT Uid, COUNT(1) AS times
- FROM dbo.T_Late
- WHERE latetime BETWEEN
- DATEADD(MONTH,-1,DATEADD(DAY,1-DAY(GETDATE()),CONVERT(VARCHAR(8),GETDATE(),112)))
- AND
- DATEADD(MILLISECOND,-2,DATEADD(DAY,1-DAY(GETDATE()),CONVERT(VARCHAR(8),GETDATE(),112)))
- GROUP BY Uid
- ) AS a
- ON dbo.T_Worker.Uid = a.Uid</P>
- <P>UPDATE dbo.T_Worker
- SET lateLog = #temp.times
- FROM dbo.T_Worker LEFT JOIN #temp ON dbo.T_Worker.Uid = #temp.Uid
- IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp</P>
复制代码
说明: 1.上个月用DATEADD处理的
2. IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp 是创建临时表的意思 创建之后要删除 所以前后都加了这一句
3. 可以实现 如果一个人上个月没有迟到 则 T_Worker的次数为0
第二个问题写的复杂了, 同求简单方法.....
|