【问题标题】:SQL query, How to return all records of dates between 15 and 20 days from nowSQL 查询,如何返回从现在起 15 到 20 天之间的所有日期记录
【发布时间】:2015-10-20 05:11:44
【问题描述】:

正如标题所说,我有合同结束日期的表格数据,我需要返回结束日期在距现在 15 到 20 天之间的所有行的列表。我有以下代码:

WHERE (DATEDIFF([day], Contract.EndDate, GETDATE()) < 20) 
AND (Contract.EndDate < DATEADD([day], 15, GETDATE()))

【问题讨论】:

  • DATEDIFF([day], Contract.EndDate, GETDATE()) between 15 and 20

标签: sql sql-server tsql date datediff


【解决方案1】:

您的查询将返回contract.endate 距离现在不到 20 天的行。试试这个where 子句

DATEDIFF([day], Contract.EndDate, GETDATE()) between 15 and 20

【讨论】:

    【解决方案2】:

    最好这样写:

    WHERE   Contract.EndDate >= DATEADD(DAY, 15, GETDATE())
    AND     Contract.EndDate < DATEADD(DAY, 21, GETDATE())
    

    注意,我假设您想要包含第 20 天的内容,因此已将 21 天添加到 GETDATE(),如果这是不正确的假设,则只需将其更改为 20

    这样做意味着两个常量(提前 15 天和 21 天)在运行时计算一次,然后不使用其他函数,而如果您使用类似的东西:

    DATEDIFF([day], Contract.EndDate, GETDATE()) < 20
    

    您必须对每一行执行DATEDIFF 函数,这意味着不能使用存在于Contract.EndDate 上的任何索引(谓词不是sargable)。即使没有索引存在,尽管开销很小,DATEDIFF 函数仍然有一点点,所以为什么要执行一个函数数百、数千甚至数百万次就足够了。

    这也主要是个人喜好,因为只要您了解BETWEEN 正在做什么,查询就可以正确编写,但我总是在处理日期时使用开放式范围(即@ 987654330@)。它更清晰(IMO)并且不太可能导致意外结果。 Aaron Bertrand 写了一篇关于这个主题的非常好的文章 - What do BETWEEN and the devil have in common?

    对于它的价值,您查询的问题是您的两个子句都指定日期小于某个日期:

    WHERE   (DATEDIFF([day], Contract.EndDate, GETDATE()) < 20) 
    

    这将限制为“EndDate”在未来少于 20 天的行,这是期望的行为,以及下一个子句

    AND     (Contract.EndDate < DATEADD([day], 15, GETDATE()))
    

    将行限制在“EndDate”小于 15 天的未来,这是不希望的行为,第二个谓词中的 &lt; 应该是 &gt;

    以今天为例,您基本上有一个 where 子句说明

    WHERE   Contract.EndDate < '2015-08-18'
    AND     Contract.EndDate < '2015-08-13'
    

    所以你有正确的上限,但这也会返回过去的所有行。

    【讨论】:

    • 究竟应该在这里工作什么?因为没有一个。
    • 第一个 where 子句应该起作用:WHERE Contract.EndDate &gt;= DATEADD(DAY, 15, GETDATE()) AND Contract.EndDate &lt; DATEADD(DAY, 21, GETDATE()) - 如果不起作用,请详细说明原因?
    • 我很抱歉,它很管用。一定是其他地方出了什么问题。非常感谢您的帮助!
    猜你喜欢
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多