跨越午夜的小时之间的SQL时间戳

时间:2016-03-22 18:34:30

标签: sql sql-server

我正在尝试根据当前时间查找当前时间段内会出现的所有记录。例如,当前时间是上午12:30,我需要从前一天下午6:00到当前时间的所有记录。非常新的SQL和任何帮助将不胜感激。

下面是表格的屏幕截图,感兴趣的列是时间戳(日期时间)。我还没有尝试过任何具体的东西,我仍然在努力想弄清楚我会怎么做。 Table

2 个答案:

答案 0 :(得分:1)

选择dateadd(小时,-6,演员(演员(getdate()作为日期)作为日期时间))

这可能有点令人费解,但以上是获得当前日期并返回6小时。这将从“昨天”返回6PM。

您可以记录TIMESTAMP>的记录。以上。

答案 1 :(得分:1)

以下查询返回“昨天下午6点”:

select DATEADD(hh, -6, DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0))

内部DATEADD获取“今天午夜”(基本上只是从“现在”截断时间部分。尝试自己运行以下内容来查看:

select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

外部DATEADD然后从“今天午夜”减去6个小时,得到“昨天下午6点”。

因此,要从表中获取时间大于昨天下午6点的所有记录,您可以将此表达式放在WHERE子句中,如下所示:

select * from MyTable 
where MyDateField > DATEADD(hh, -6, DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0))

在SQL中操作日期的选项仅受您的想象力的限制:)

例如,在下面的评论中,您希望过滤“当前班次”,可能是6 AM-6PM或6 PM-6AM,具体取决于当前时间。这会更复杂,但仍然可行,如下:

select * from MyTable
where MyDateField >= 
    case 
    when datepart(hh, getdate()) < 6 then -- if before 6AM
        --yesterday at 6 PM
        dateadd(hh, -6, dateadd(dd, datediff(dd, 0, getdate()), 0))
    when datepart(hh, getdate()) between 6 and 18 then -- if between 6AM and 6PM
        --today at 6 AM
        dateadd(hh, 6, dateadd(dd, datediff(dd, 0, getdate()), 0))
    else -- if after 6 PM
        --today at 6 PM
        dateadd(hh, 18, dateadd(dd, datediff(dd, 0, getdate()), 0))
    end
and MyDateField < 
    case 
    when datepart(hh, getdate()) < 6 then -- if before 6AM
        --today at 6 AM
        dateadd(hh, 6, dateadd(dd, datediff(dd, 0, getdate()), 0))
    when datepart(hh, getdate()) between 6 and 18 then -- if between 6AM and 6PM
        --today at 6 PM
        dateadd(hh, 18, dateadd(dd, datediff(dd, 0, getdate()), 0))
    else -- if after 6 PM
        --tomorrow at 6 AM
        dateadd(hh, 30, dateadd(dd, datediff(dd, 0, getdate()), 0))
    end

注意这是如何重复使用“今天午夜”的相同计算,并简单地添加一个可变的小时数,具体取决于当天的当前小时,datepart派上用场。

祝你好运!