黑马程序员技术交流社区

标题: SQL getdate datediff 函数如何使用 [打印本页]

作者: 聂广强    时间: 2013-7-12 22:37
标题: SQL getdate datediff 函数如何使用
本帖最后由 聂广强 于 2013-7-25 14:59 编辑

信息表『工号,姓名,迟到次数』T_Worker『Uid,name,lateLog』迟到表『工号,迟到日期,迟到时长』T_Late『Uid,latetime,latelong』
1)查询员工姓名含有O的员工在昨天迟到的时长!(每天只会记一次迟到)
select name, latelong fromT_Late
joinT_Worker on (T_Worker.Uid =T_Late.Uid)
where name LIKE '%O%' and Datediff(d,GETDATE(),latetime)=1



2)跟新表每个员工迟到次数为“上月迟到次数”次数之和
用getdate   datediff

update a
set a.latetimes= c.times
from T_Worker a ,T_Late b ,(select a.Uid ,COUNT(1) as times from T_Worker a, late b where a.Uid=b.Uid and b.latetime is not null group by a.Uid) as c
where a.Uid =b.Uid and a.Uid =c.Uid



这个是我写的sql语句貌似有点问题 该怎么解决



作者: 彭家贰小姐    时间: 2013-7-13 10:11
本帖最后由 彭家贰小姐 于 2013-7-13 10:23 编辑

1.表的建立


   
2.问题
  1. SELECT T_Worker.Uid,name ,
  2. CASE WHEN latelong IS NULL THEN 0 ELSE latelong END latelong
  3. FROM dbo.T_Worker
  4. LEFT JOIN (SELECT * FROM dbo.T_Late WHERE latetime = CONVERT(VARCHAR(10),GETDATE()-1,120) ) AS temp ON dbo.T_Worker.Uid = temp.Uid
  5. WHERE name LIKE N'%荣%'
复制代码

说明: 1. 昨天 CONVERT(VARCHAR(10),GETDATE()-1,120) )
        2.颜荣州 昨天没有迟到 所以要记录为 0 CASE WHEN latelong IS NULL THEN 0 ELSE latelong END

疑问:1.T_Worker这张表的迟到次数不是应该记录总的吗?为什么要更新为上月迟到的次数呢?
       2.如果一个人上个月没迟到 是不是 在T_Worker表中他的迟到次数 就为 0 ?
  1. IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp
  2. SELECT T_Worker.Uid, (CASE WHEN times IS NULL THEN 0 ELSE times END )AS times
  3. INTO #temp
  4. FROM dbo.T_Worker
  5. LEFT JOIN (
  6.      SELECT Uid, COUNT(1) AS times
  7.      FROM dbo.T_Late
  8.      WHERE latetime BETWEEN
  9.      DATEADD(MONTH,-1,DATEADD(DAY,1-DAY(GETDATE()),CONVERT(VARCHAR(8),GETDATE(),112)))
  10.      AND
  11.      DATEADD(MILLISECOND,-2,DATEADD(DAY,1-DAY(GETDATE()),CONVERT(VARCHAR(8),GETDATE(),112)))
  12.      GROUP BY Uid
  13. ) AS a
  14. ON dbo.T_Worker.Uid = a.Uid</P>
  15. <P>UPDATE dbo.T_Worker
  16. SET lateLog = #temp.times
  17. FROM dbo.T_Worker LEFT JOIN #temp ON dbo.T_Worker.Uid = #temp.Uid
  18. 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

第二个问题写的复杂了, 同求简单方法.....







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2