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

时间:2017-03-03 20:02:33

标签: sql-server-2008 date-range

我需要在包含交易信息的表格中创建日期范围。该表通过手动过程在整个星期中偶尔更新。每次更新表时,都会将事务添加到上一个星期日。例如,上传发生在昨天,因此交易在上周日(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语句中使用新值作为参考我只得到最大值或值I减去那个陈述。例如,如果我说WHERE TransactionDate> = MAX(TransactionDate)-21且最大日期是2月26日,则结果是2月2日,而不是2月2日到2月26日的日期范围。

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

提前感谢StackOverflow大师!

2 个答案:

答案 0 :(得分: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 |
+------------+

答案 1 :(得分:0)

我刚发现这是为了查找属于给定周的日期。可以操纵代码来更改周开始日期。

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*/

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

Query Result

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