在 SSMS 中,如何使用 DATEADD 函数获取'2018-09-01 00:00:00.000'和'2018-09-01 023:59:00.000'之间的所有值



我正在使用SQL Server Management Studio 2014并尝试编写查询来获取具有订单下几天日期的所有值,我不想对日期的inter子句进行硬编码,并希望使用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 中使用 addDate 和 between 来完成此操作吗?

使WHERE子句可 SARGABLE 以便它可以从索引中受益,可以大大提高性能。最好不要摆弄试图获得一天中的"最后"时间,只需使用半开放间隔:

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 );

不是超级优雅,但你可以使用强制 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"之间

我认为"最干净"的方法是使用DATEFROMPARTS和DATEPART方法:

SELECT OrderId
FROM [XXXX].[dbo].[INBOUNDORDHEADER]
WHERE DATEFROMPARTS(
DATEPART(YEAR, OrderDate),
DATEPART(MONTH, OrderDate),
DATEPART(DAY, OrderDate)) = '2018-09-01'

编辑:这对性能不利。请参阅HABO的答案,了解执行此操作的最佳方法。

最新更新