我正在使用SQL Server Management Studio 2014,并尝试编写查询以获取具有隔天订单日期的所有值,我不想硬编码日期的between子句,并想使用DateAdd或类似的东西函数,因此它可以一致地工作而无需更改语法。硬编码查询的示例如下。
SELECT OrderId
FROM [XXXX].[dbo].[INBOUNDORDHEADER]
between '2018-09-01 00:00:00.000' and '2018-09-01 023:59:00.000'
使用DATEADD或类似函数为此编写语法的最佳方法是什么?
有没有一种方法可以区分检索到的值的时间?例如,仅在2018-09-01提取所有内容,而不根据其时间格式排除记录
我可以在之间使用AddDate完成此操作吗?
答案 0 :(得分:2)
使WHERE
子句SARGABLE使其从索引中受益可以大大提高性能。最好不要摆弄一天中的“最后”时间,只需使用half-open interval:
declare @Today as DateTime = Cast( GetDate() ); -- Strip the time-of-day.
select OrderId
from [XXXX].[dbo].[INBOUNDORDHEADER]
where DateAdd( day, 1, @Today ) <= OrderDate and OrderDate < DateAdd( day, 2, @Today );
答案 1 :(得分:1)
不太优雅,但是您可以使用DATE强制转换时间:
SELECT OrderId
FROM [XXXX].[dbo].[INBOUNDORDHEADER]
BETWEEN DATEADD(day, 1, CAST(GETDATE() As DATE)) AND DATEADD(day, 2, CAST(GETDATE() As DATE))
这将为您提供介于明天午夜和次日午夜之间的日期范围。使用您的示例和今天的日期,它将在'2018-09-01 00:00:00'和'2018-09-02 00:00:00'之间
答案 2 :(得分:1)
我认为“最干净”的方法是使用DATEFROMPARTS和DATEPART方法:
SELECT OrderId
FROM [XXXX].[dbo].[INBOUNDORDHEADER]
WHERE DATEFROMPARTS(
DATEPART(YEAR, OrderDate),
DATEPART(MONTH, OrderDate),
DATEPART(DAY, OrderDate)) = '2018-09-01'
编辑:这对性能不好。参见HABO的答案,以了解实现此目的的最佳方法。