【问题标题】:Use Max date to create a date range使用 Max date 创建日期范围
【发布时间】:2017-03-03 20:02:33
【问题描述】:

我需要在包含交易信息的表中创建一个日期范围。该表在一周内通过手动过程偶尔更新。每次更新表时,事务都会添加到上一个星期日。例如,上传是昨天进行的,因此交易是在上周日(2 月 26 日)加载的。如果它是在星期三装载的,它的日期仍然是星期日。关键是我的事务以及数据加载到表时都有一个移动目标。我正在尝试将我的回溯期修复为最新交易的日期,然后再回溯三周。这是我提出的查询:

SELECT distinct TransactionDate 
FROM TransactionTABLE TB
 inner join (
    SELECT distinct top 21 TransactionDate FROM TrasactionTABLE ORDER BY TransactionDate desc
    ) A  on TB.TransactionDate = A.TransactionDate
ORDER BY TB.TransactionDate desc

从技术上讲,此代码有效。我现在遇到的问题是,如果在给定日期(例如银行假期(在本例中为马丁路德金纪念日))没有交易,那么查询回溯到某一天太远了。

我尝试了一些不同的选项,包括 MAX(TransactionDate),但是如果我在子查询或 CTE 中使用它,那么在 WHERE 语句中使用新值作为参考,我只会得到最大值或减去的值该声明由。例如,如果我说 WHERE TransactionDate >= MAX(TransactionDate)-21 并且最大日期是 2 月 26 日,那么结果是 2 月 2 日,而不是 2 月 2 日到 2 月 26 日的日期范围。

在总结中,我需要的是从最近交易日期起三周后的日期范围。这是针对每日报告的,因此我无法将日期硬编码。由于我也在使用 Excel 连接,因此禁止使用 Declare 语句。

提前感谢 StackOverflow 大师!

【问题讨论】:

    标签: sql-server-2008 date-range


    【解决方案1】:

    你可以这样使用:

    ;with n as (select n from (values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) t(n))
    , dates as (
      select top (21) 
          [Date]=convert(date,dateadd(day, row_number() over (order by (select 1))-1
          , dateadd(day,-20,(select max(TransactionDate) from t) ) ) )
        from         n as deka
          cross join n as hecto
       order by [Date]
    )
    
    select Date=convert(varchar(10),dates.date,120) from dates
    

    rextester 演示:http://rextester.com/ZFYV25543

    返回:

    +------------+
    |    Date    |
    +------------+
    | 2017-02-06 |
    | 2017-02-07 |
    | 2017-02-08 |
    | 2017-02-09 |
    | 2017-02-10 |
    | 2017-02-11 |
    | 2017-02-12 |
    | 2017-02-13 |
    | 2017-02-14 |
    | 2017-02-15 |
    | 2017-02-16 |
    | 2017-02-17 |
    | 2017-02-18 |
    | 2017-02-19 |
    | 2017-02-20 |
    | 2017-02-21 |
    | 2017-02-22 |
    | 2017-02-23 |
    | 2017-02-24 |
    | 2017-02-25 |
    | 2017-02-26 |
    +------------+
    

    【讨论】:

    • 这可以工作,但是,查询是针对每日仪表板的,所以我需要一些自动化的东西,这就是我需要参考最大日期的原因。另一件事是 Excel 不允许在连接中使用 Declare 语句。对不起,我应该在一开始就提到这两个。我会更新我原来的帖子。
    • @MHeath 您可以将@fromdate 替换为如下子查询:dateadd(day,-20,(select max(TransactionDate) from t))
    • 好的,我认为我做错了什么,因为我在“n as deka”处的 FROM 上收到错误
    • ;以 N 为 (select n from (values(0),(1),(2),(3),(4),(5),(6),(7), (8),(9)) t(n)) , 日期为 ( select top (21) [Date]=convert(date,dateadd(day, row_number() over (order by (select 1))-1 , dateadd (day,-20,(SELECT max(lockdttm) FROM TransactionTABLE))) FROM n as deka cross join N as hecto order by [Date] ) select Date=convert(varchar(10),dates.date,120) from dates
    • @MHeath 你在from n 之前丢失了一个右括号。添加另一个
    【解决方案2】:

    我刚刚发现它是为了查找给定一周内的日期。可以操纵代码来更改星期的开始日期。

    select convert(datetime,dateadd(dd,-datepart(dw,convert(datetime,convert(varchar(10),DateAdd(dd,-1/*this # changes the week start day*/,getdate()),101)))+1/*this # is used to change the week start date*/,
           convert(datetime,convert(varchar(10),getdate(),21))))/*also can enter # here to change the week start date*/
    

    如果您要将其包含在完整的查询中,我已经包含了结果的屏幕截图。通过这种方式,您可以查看一系列日期的外观。我做了一些操作,以便一周从星期一开始并参考星期一的日期。

    由于我只回顾三周,一个简单的 GETDATE()-21 就足够了,因为随着查询在一周内向前推进,它将回顾 21 天并选择一周开始的星期一作为我的开始日期。

    【讨论】:

      猜你喜欢
      • 2012-05-28
      • 1970-01-01
      • 2012-12-06
      • 2021-12-31
      • 2016-11-17
      • 2011-08-31
      • 2020-03-28
      • 1970-01-01
      相关资源
      最近更新 更多