当前位置: 代码迷 >> Sql Server >> 时间的筛选和比较,用sql查询怎么做?在线
  详细解决方案

时间的筛选和比较,用sql查询怎么做?在线

热度:83   发布时间:2016-04-27 10:48:44.0
时间的筛选和比较,用sql查询如何做?在线急
 
表结构如下:
 f_ReadDate f_ConsumerName
2012-9-29 8:31:03 lanyang
2012-9-29 8:31:04 lanyang
2012-9-29 8:28:23 wangxiao
2012-9-29 8:27:12 chenchunli
2012-9-29 8:27:01 chenchunli
2012-9-29 8:26:33 liuzg
2012-9-29 8:25:22 zhouar
2012-9-29 8:25:21 tangyc
2012-9-29 8:31:12 zhangsh
2012-9-29 8:21:33 yangmei
2012-9-29 8:21:45 yangmei
2012-9-29 8:21:23 jianghy
2012-9-29 8:21:15 jianghy
2012-9-29 8:09:12 liuyi
2012-9-29 8:09:22 zhangsf
2012-9-28 17:44:15 tangyc
2012-9-28 17:43:15 tangyc
2012-9-28 17:41:23 liuyi
2012-9-28 17:40:14 jianghy

这是个上下班打卡的记录,现在想筛选数据,一是上班有两条记录以上的,选择时间靠后的一条记录,下班有两条以上记录的,选择时间靠前的。

------解决方案--------------------
看下是否可以
SQL code
--> 测试数据:[tb]IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]GO CREATE TABLE [tb]([f_ReadDate] DATETIME,[f_ConsumerName] VARCHAR(10))INSERT [tb]SELECT '2012-9-29 8:31:03','lanyang' UNION ALLSELECT '2012-9-29 8:31:04','lanyang' UNION ALLSELECT '2012-9-29 8:28:23','wangxiao' UNION ALLSELECT '2012-9-29 8:27:12','chenchunli' UNION ALLSELECT '2012-9-29 8:27:01','chenchunli' UNION ALLSELECT '2012-9-29 8:26:33','liuzg' UNION ALLSELECT '2012-9-29 8:25:22','zhouar' UNION ALLSELECT '2012-9-29 8:25:21','tangyc' UNION ALLSELECT '2012-9-29 8:31:12','zhangsh' UNION ALLSELECT '2012-9-29 8:21:33','yangmei' UNION ALLSELECT '2012-9-29 8:21:45','yangmei' UNION ALLSELECT '2012-9-29 8:21:23','jianghy' UNION ALLSELECT '2012-9-29 8:21:15','jianghy' UNION ALLSELECT '2012-9-29 8:09:12','liuyi' UNION ALLSELECT '2012-9-29 8:09:22','zhangsf' UNION ALLSELECT '2012-9-28 17:44:15','tangyc' UNION ALLSELECT '2012-9-28 17:43:15','tangyc' UNION ALLSELECT '2012-9-28 17:41:23','liuyi' UNION ALLSELECT '2012-9-28 17:40:14','jianghy'--------------开始查询--------------------------SELECT  [f_ReadDate] , [f_ConsumerName] , 状态FROM    (         SELECT * , 状态 = CASE WHEN CONVERT(VARCHAR(8) , [f_ReadDate] , 108) > '08:30:59' THEN '迟到'                              ELSE '正常上班'                         END , 1 AS 上下班         FROM   [tb] AS t         WHERE  NOT EXISTS ( SELECT 1                             FROM   tb                             WHERE  CONVERT(VARCHAR(8) , [f_ConsumerName] , 112) = CONVERT(VARCHAR(8) , t.[f_ConsumerName] , 112)                                    AND [f_ReadDate] > t.[f_ReadDate]                                    AND CONVERT(VARCHAR(8) , [f_ReadDate] , 108) < '12:00:00' )                AND CONVERT(VARCHAR(8) , [f_ReadDate] , 108) < '12:00:00'         UNION ALL         SELECT * , 状态 = CASE WHEN CONVERT(VARCHAR(8) , [f_ReadDate] , 108) < '12:00:00' THEN '早退'                              ELSE '正常下班'                         END , 2 AS 上下班         FROM   [tb] AS t         WHERE  NOT EXISTS ( SELECT 1                             FROM   tb                             WHERE  CONVERT(VARCHAR(8) , [f_ConsumerName] , 112) = CONVERT(VARCHAR(8) , t.[f_ConsumerName] , 112)                                    AND [f_ReadDate] > t.[f_ReadDate]                                    AND CONVERT(VARCHAR(8) , [f_ReadDate] , 108) > '13:00:00' )                AND CONVERT(VARCHAR(8) , [f_ReadDate] , 108) > '13:00:00'        ) AS tORDER BY [f_ConsumerName] , 上下班                 ----------------结果----------------------------/* f_ReadDate    f_ConsumerName    状态2012-09-29 08:27:12.000    chenchunli    正常上班2012-09-29 08:21:23.000    jianghy    正常上班2012-09-28 17:40:14.000    jianghy    正常下班2012-09-29 08:31:04.000    lanyang    迟到2012-09-29 08:09:12.000    liuyi    正常上班2012-09-28 17:41:23.000    liuyi    正常下班2012-09-29 08:26:33.000    liuzg    正常上班2012-09-29 08:25:21.000    tangyc    正常上班2012-09-28 17:44:15.000    tangyc    正常下班2012-09-29 08:28:23.000    wangxiao    正常上班2012-09-29 08:21:45.000    yangmei    正常上班2012-09-29 08:09:22.000    zhangsf    正常上班2012-09-29 08:31:12.000    zhangsh    迟到2012-09-29 08:25:22.000    zhouar    正常上班*/
  相关解决方案