我正在尝试根据当前时间查找当前时间段内会出现的所有记录。例如,当前时间是上午12:30,我需要从前一天下午6:00到当前时间的所有记录。非常新的SQL和任何帮助将不胜感激。
下面是表格的屏幕截图,感兴趣的列是时间戳(日期时间)。我还没有尝试过任何具体的东西,我仍然在努力想弄清楚我会怎么做。 Table
答案 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
派上用场。