首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在SSMS中,如何使用DATEADD函数获取'2018-09-01 00:00:00.000‘到'2018-09-01 023:59:00.000’之间的所有值?

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

Stack Overflow用户
提问于 2018-09-01 01:15:06
回答 3查看 101关注 0票数 2

我正在使用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和between来完成这项任务吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-01 01:21:47

不是很优雅,但是你可以使用一个造型来剥离时间:

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’之间。

票数 1
EN

Stack Overflow用户

发布于 2018-09-01 10:12:58

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 );
票数 2
EN

Stack Overflow用户

发布于 2018-09-01 01:21:57

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

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

编辑:这对性能不好。请参阅HABO的答案,了解实现这一目标的最佳方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52120073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档