【问题标题】:SQL Server, filter for max date and max date minus 7 daysSQL Server,过滤最大日期和最大日期减去 7 天
【发布时间】:2019-11-29 17:35:00
【问题描述】:

我正在尝试设计一个视图并在我的时间戳(日期时间)上应用几个条件:最后一个日期和最后一个日期减去 7 天。 这适用于最后一个日期:

SELECT *
FROM table 
WHERE timestamp = (SELECT MAX(timestamp) FROM table) 

到目前为止,我想不出添加负 7 天的方法。

我试过了,例如

SELECT *
FROM table
WHERE (timestamp = (SELECT MAX(timestamp) FROM table)) OR (timestamp = (SELECT DATEADD(DAY, -7, MAX(timestamp)) FROM table)

以及其他一些变体,包括 GETDATE() 而不是 MAX,但是,我收到了执行超时消息。

请让我知道在这种情况下我应该遵循什么逻辑。

Data looks like this, but there's more of it :)

所以我只想获取 29/11/2019 和 22/11/2019 的行的数据。我对过滤因子有一个额外的要求,但这是一个简单的要求。

【问题讨论】:

  • 样本数据和期望的结果会有所帮助。

标签: sql sql-server date datetime max


【解决方案1】:

如果您关心日期,那么也许您想要:

select t.*
from t cross join
     (select max(timestamp) as max_timestamp from t) tt
where (t.timestamp >= convert(date, max_timestamp) and
       t.timestamp < dateadd(day, 1, convert(date, max_timestamp))
      ) or
      (t.timestamp >= dateadd(day, -7, convert(date, max_timestamp)) and
       t.timestamp < dateadd(day, -6, convert(date, max_timestamp))
      );

【讨论】:

  • 谢谢,但能否请您澄清一下,什么是“tt”以及为什么要交叉加入 max_timestamp,如果以后没有提及它?另外,convert(date, ...) 似乎对我不起作用,我想我需要使用 varchar(103),但这让我感到困惑,因为 dateadd "day" 已经指定,什么是转换它的理由?
  • @ako 。 . .这是一个非常好的问题。我修复了引用。
【解决方案2】:

所以我最终得到了下一个代码:

SELECT *
FROM table    
WHERE (timestamp >= CAST(DATEADD(DAY, - 1, GETDATE()) AS datetime)) AND (timestamp < CAST(GETDATE() AS DATETIME)) OR
                 (timestamp >= CAST(DATEADD(DAY, - 8, GETDATE()) AS datetime)) AND (timestamp < CAST(DATEADD(day, - 7, GETDATE()) AS DATETIME)) AND (Factor1 = 'Criteria1' OR
                 Factor2 = 'Criteria2')

不确定这是最好的还是最优雅的解决方案,但它对我有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-21
    • 2022-01-28
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多