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

时间:2018-08-31 17:15:06

标签: sql-server tsql

我正在使用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完成此操作吗?

3 个答案:

答案 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的答案,以了解实现此目的的最佳方法。