使用DateTime值过滤前一天的数据

时间:2017-03-07 09:56:17

标签: sql sql-server sql-server-2008-r2

我正在尝试使用SQL Server 2008 r2检索昨天班次的数据。

班次从下午20:00开始,到第二天上午10:00结束。

我可以使用什么日期函数来检索整个班次的数据?

使用此:

CAST([LastStartedDate] as time)>  cast('20:00' as Time)

只会在午夜之前检索数据。

1 个答案:

答案 0 :(得分:1)

您可以使用WHERE子句过滤日期,该子句使用某些日期操作,如下所示:

WHERE   LastStartedDate >= DATEADD(HOUR, 20,
                           CAST(CAST(DATEADD(DAY, -1, GETDATE()) AS DATE) AS DATETIME));

这首先得到昨天的日期,作为DATE,因此删除时间部分:

SELECT CAST(DATEADD(DAY, -1, GETDATE()) AS DATE)
-- 2017-03-06

然后将其转换回DATETIME以将时间添加到当天的午夜:

SELECT CAST(CAST(DATEADD(DAY, -1, GETDATE()) AS DATE) AS DATETIME)
-- 2017-03-06 00:00:00.000

然后它会增加20个小时到达20:00 - 晚上8点:

SELECT DATEADD(HOUR, 20,CAST(CAST(DATEADD(DAY, -1, GETDATE()) AS DATE) AS DATETIME));
-- 2017-03-06 20:00:00.000

对于您的方案,您需要再次执行相同的操作以将上午10点切断并使用BETWEEN

示例:

CREATE TABLE #shift
    (
      LastStartedDate DATETIME ,
      WorkItemsDone INT
    );

INSERT  INTO #shift
        ( LastStartedDate, WorkItemsDone )
VALUES  ( DATEADD(HOUR, -18, GETDATE()), 10 ),
        ( DATEADD(HOUR, -15, GETDATE()), 20 ),
        ( DATEADD(HOUR, -14, GETDATE()), 30 ),
        ( DATEADD(HOUR, -10, GETDATE()), 40 ),
        ( DATEADD(HOUR, -5, GETDATE()), 25 ),
        ( DATEADD(HOUR, -2, GETDATE()), 15 ),
        ( DATEADD(HOUR, 4, GETDATE()), 5 ),
        ( DATEADD(HOUR, 10, GETDATE()), 15 );

-- all data
SELECT * 
FROM #shift

-- limited data
SELECT  *
FROM    #shift
WHERE   LastStartedDate BETWEEN 
        DATEADD(HOUR, 20, CAST(CAST(DATEADD(DAY, -1, GETDATE()) AS DATE) AS DATETIME))
        AND DATEADD(HOUR, 10, CAST(CAST(GETDATE() AS DATE) AS DATETIME))

DROP TABLE #shift;

产地:

-- all data
LastStartedDate          WorkItemsDone
2017-03-06 16:18:04.877  10
2017-03-06 19:18:04.877  20
2017-03-06 20:18:04.877  30
2017-03-07 00:18:04.877  40
2017-03-07 05:18:04.877  25
2017-03-07 08:18:04.877  15
2017-03-07 14:18:04.877  5
2017-03-07 20:18:04.877  15

-- filtered data
LastStartedDate          WorkItemsDone
2017-03-06 20:18:04.877  30
2017-03-07 00:18:04.877  40
2017-03-07 05:18:04.877  25
2017-03-07 08:18:04.877  15