我早上6点30分上班,需要审核从下午5点到今天早上6点30分发生的事情。我使用代码从任何给定时间向后搜索 13.5 小时:
SELECT * FROM TRANSACTION_HISTORY
WHERE TRANSACTION_HISTORY.ACTIVITY_DATE_TIME > (SELECT DATEADD(hour,-13.5,(SELECT MAX (TRANSACTION_HISTORY.ACTIVITY_DATE_TIME) FROM TRANSACTION_HISTORY)))
问题是如果我稍后运行查询,我会从一开始就浪费时间,例如。如果我在早上 7 点运行查询,我只会从下午 5:30 开始得到结果。与其每天更改标准,我希望能够从当天早上 6:30 搜索到前一天下午 5:30。这能做到吗?
通常,我不建议对datetime
使用between
,因为边界条件会引起混淆。 我认为情况并非如此。
这是一种方法:
SELECT *
FROM TRANSACTION_HISTORY th
WHERE th.ACTIVITY_DATE_TIME between cast(cast(getdate() -1 as date) as datetime) + 17.5/24.0
cast(cast(getdate() as date) as datetime) + 6.5/24.0;
表达式 cast(cast(getdate() as date) as datetime)
将日期时间值截断为午夜。 作为datetime
,SQL Server允许您添加一个数字,该数字被理解为一天的一小部分。 因此,17.5/24
表示"5:30"。 此添加不适用于date
数据类型。
这样做。
DECLARE @dt datetime
DECLARE @dt1 datetime
DECLARE @dt2 datetime
SET @dt = CONVERT(datetime, CONVERT(VARCHAR(10), getdate(), 101 ), 101)
SET @dt1 = dateadd(mi, 30, dateadd(hh, 6, @dt))
SET @dt2 = dateadd(mi, -27*30, @dt1)
SELECT @dt1 as StartDate, @dt2 as EndDate
有关此脚本的其他详细信息,您可以查看这些页面。
http://technet.microsoft.com/en-us/library/ms174450%28v=sql.105%29.aspx
http://technet.microsoft.com/en-us/library/ms186819%28v=sql.105%29.aspx