Sql server 2008 使用“最大日期”创建日期范围

Sql server 2008 使用“最大日期”创建日期范围,sql-server-2008,date-range,Sql Server 2008,Date Range,我需要在包含交易信息的表中创建一个日期范围。该表通过手动过程在一周内偶尔更新。每次更新表时,事务都会添加到上一个星期日。例如,上传发生在昨天,因此交易在2月26日的上周日被加载。如果它是在周三装载的,那么它的日期仍然是周日。关键是,我的事务和数据加载到表时都有一个移动的目标。我正试图将我的回顾期定为最近一笔交易的日期,然后再往回三周。以下是我提出的问题: SELECT distinct TransactionDate FROM TransactionTABLE TB inner join (

我需要在包含交易信息的表中创建一个日期范围。该表通过手动过程在一周内偶尔更新。每次更新表时,事务都会添加到上一个星期日。例如,上传发生在昨天,因此交易在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
从技术上讲,这个代码是有效的。我现在遇到的问题是,当在给定日期没有交易时,例如在本例中的银行假日马丁·路德·金日,那么查询就回过头来过了一天

我尝试了几个不同的选项,包括MAXTransactionDate,但是如果我在子查询或CTE中使用它,那么在WHERE语句中使用新值作为引用,我只得到最大值或减去该语句的值。例如,如果我说其中TransactionDate>=MAXTransactionDate-21,最大日期是2月26日,那么结果是2月2日,而不是从2月2日到2月26日的日期范围

总之,我需要的是一个日期范围,从最近一个交易日期向后看三周。这是一份日报,所以我不能硬编码日期。由于我也使用Excel连接,因此禁止使用Declare语句


提前感谢大师们

您可以使用以下内容:

;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演示:

返回:

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

但是,这可能行得通,这个查询是针对每日仪表板的,所以我需要一些自动化的东西,这就是为什么我需要引用最长日期的原因。另一件事是Excel不允许在连接中使用Declare语句。对不起,我应该一开始就提到这两个。我将更新我的原始帖子。@MHeath您可以用如下子查询替换@fromdate:dateaddday,-20,选择maxTransactionDate from tOkay,我想我做错了什么,因为我在from n上得到了一个错误作为deka;将N作为选择值0,1,2,3,4,5,6,7,8,9 tn中的N,日期作为选择前21[Date]=convertdate,dateaddday,按选择1-1,dateaddday,-20,从事务表N中选择maxlockdttm作为deka交叉连接N作为hecto order by[Date]选择日期=convertvarchar10,dates.Date,120来自dates@MHeath从n开始,您丢失了一个右括号。再加一个
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*/