使用最大日期创建日期范围

Use Max date to create a date range

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

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 语句。

提前谢谢 Whosebug 大师!

你可以使用这样的东西:

;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

returns:

+------------+
|    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 |
+------------+

我刚刚发现这个用于查找给定一周内的日期。可以操纵代码来更改周开始日期。

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 天,并选择一周开始的星期一作为我的开始日期。