【问题标题】:SQL DateDifference in a where clausewhere 子句中的 SQL 日期差异
【发布时间】:2011-07-13 02:31:27
【问题描述】:

我正在做如下查询:

SELECT
  *
FROM a
WHERE DATEDIFF(D, a.DateValue, DateTimeNow) < 3;

不工作

我正在尝试获取不超过 3 天的数据。

SQL 服务器。

如何做到这一点?

DATEDIFF 工作太慢..

【问题讨论】:

    标签: sql sql-server datetime projection


    【解决方案1】:

    DateDiff 非常快...您的问题是您在数据库表列值上运行它,因此查询处理器必须在表中的每一行上运行该函数,即使该列上有索引.这意味着它必须从磁盘加载整个表。

    改为在今天使用dateAdd 函数,并将数据库表列与单次计算的结果进行比较。现在它只运行DateAdd() 一次,并且它可以使用索引(如果存在),只加载与谓词条件匹配的行。

    Where a.DateValue &gt; DateAdd(day,-3,getdate())

    这样做会使您的查询谓词SARG-able

    【讨论】:

    • SARG-able,我以前没听说过。谢谢!
    • the query processor must run the function on every row in the table 帮助我理解并解决了我遇到的问题,即完全相同的 DATEDIFF 语句会抱怨 WHERE 子句中的溢出但在 SELECT 中没有。
    • 我在使用带有 DATEDIFF 的 where 的子查询时遇到了麻烦,这让我抓狂,您的解决方案很棒,真的对我有帮助。非常感谢。
    • Where 中执行DateAdd 或将其分配给外部变量是否重要?
    • 您的意思是在 SQL 查询语句中或在 SQL 语句之外但在存储过程中创建的变量中?
    【解决方案2】:

    http://msdn.microsoft.com/en-us/library/aa258269%28v=sql.80%29.aspx 上的 Microsoft 文档建议您应该使用 getdate() 而不是 DateTimeNow。这样会更好吗?

    【讨论】:

      【解决方案3】:

      您的查询似乎不错。另一种解决方法是:

      SELECT * FROM a WHERE a.DateValue > DATEADD(dd,-3,GETDATE())
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-04
        • 2019-07-15
        • 2012-06-24
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多