【问题标题】:Datediff GETDATE AddDatediff GETDATE 添加
【发布时间】:2012-02-06 23:24:49
【问题描述】:

在这种类型的代码中,

AND Orders.ShipDate >= DATEADD(Day, Datediff(Day,0, GetDate() -6), 0)

它应该提取日期为 6 天前的记录,直到今天。如何让它从 7 天前到昨天提取记录?

我知道将 -6 更改为 -7 会提取 7 天前的记录,但哪个变量是日期跨度的结束,所以我可以将其更改为 -1

【问题讨论】:

    标签: sql sql-server-2005 datediff dateadd


    【解决方案1】:

    这不是日期跨度。

    你所拥有的条件实际上只有一个条件:大于。大于的右侧是 6 天前,因此您的条件匹配任何晚于 6 天前的日期。换句话说,它并没有止于今天。它包括明天、下周和明年。

    AND ( Orders.ShipDate >= DATEADD(Day, Datediff(Day,0, GetDate() -7), 0)
          AND Orders.ShipDate < DATEADD(Day, Datediff(Day,0, GetDate()), 0) )
    

    这才是你真正想要的。它匹配晚于 7 天前当天午夜的日期,以及今天午夜之前的日期(即昨天的任何时间)。

    【讨论】:

    • 你有一个额外的括号
    【解决方案2】:

    “日期范围的结束”不在您的查询中。

    将您的代码更改为:

    AND (Orders.ShipDate BETWEEN DATEADD(Day, -1, GetDate()) AND DATEADD(Day, -7, GetDate()))

    【讨论】:

    • @user1090389:上面更干净。
    【解决方案3】:

    这也应该有效,它消除了不必要的 0 天添加:

    select *,DATEDIFF(Day, orders.ShipDate, GETDATE()) AS DAYS_SINCE_TODAY
    from Orders 
    where DATEDIFF(Day, orders.ShipDate, GETDATE()) >= 1 AND --This many days since today
          DATEDIFF(Day, orders.ShipDate, GETDATE()) <= 7     --Going back this many days
    

    【讨论】:

      【解决方案4】:

      我喜欢 BETWEEN 函数。这可能与您使用的 SQL 风格不同,但这是我使用的。

      BETWEEN dateadd(second, 0, dateadd(dd,datediff(dd,7,getdate()),0)) AND dateadd(second,-1, dateadd(dd,datediff(dd,0,getdate()),0))  
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多