【问题标题】:Select all rows from the previous date选择上一个日期的所有行
【发布时间】:2014-01-03 16:38:07
【问题描述】:

我正在尝试进行 SQL 查询(将转换为 SSRS 报告),它将获取前一天打开的所有内容。这必须每天自动运行,因此手动输入日期实际上不是一个选项。

【问题讨论】:

  • 查看 DateAdd() 负增量

标签: sql-server reporting-services reporting


【解决方案1】:

最安全(就基础数据类型的更改或隐式转换而言)和最有效(就使用索引查找的最佳机会而言)是一个开放式范围:

WHERE datetime_column >= DATEADD(DAY, DATEDIFF(DAY, 1, GETDATE()),0)
  AND datetime_column <  DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()),0);

更多细节见:

【讨论】:

    【解决方案2】:
    WHERE CAST(DATE_Column AS DATE) = CAST(DATEADD(DAY, - 1, GETDATE()) AS DATE)
    

    【讨论】:

    • 虽然这是所有 SQL Server 中的一个例外,其中对 WHERE 子句中的列应用表达式仍会产生可分析的表达式,但它仍可能导致灾难性的基数估计 (please see this question on dba.se)。有时看起来像捷径的东西并不总是最好的解决方案。范围查询要安全得多。
    • @AaronBertrand 感谢您指出这一点,并且链接非常有用。欢呼
    【解决方案3】:
    select DATEADD(DD,-1,getDate()) as Yesterday
    
    select * from <table> where date_in_question = DATEADD(DD,-1,getDate())
    

    如果您只需要日期,请执行此操作

    declare @yesterday as Date
    
    set @yesterday = cast(DATEADD(DD,-1,getDate()) as Date)
    
    select * from <table> where date_in_question = @yesterday
    

    【讨论】:

    • 看起来像日期和时间,因为他指的是活动日期。你也必须 CAST 你的专栏。
    • 如果它是数据表中的日期时间,他将不得不强制转换列,好点,谢谢
    • 另外请不要使用像DD这样的懒惰速记。 DAY 只是一个额外的字符,而且更加自我记录。对于一些不直观的惰性速记示例,read this post
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多