选择n天前(不包括周末)的日期

时间:2019-03-14 16:28:17

标签: sql sql-server sql-server-2012

我有一张桌子,每天的日期从1999年12月31日到2050年12月31日,不包括周末。

说出一个特定的日期,对于此示例,请使用2019-03-14。我想选择30天之前的日期(天数需要灵活,因为它不一定总是30天),而忽略了周末,在这种情况下为2019-02-01。

该怎么做?

我在下面写下了查询,它确实列出了指定日期之前30天。

 select top 30 Date 
 from DateDimension
 where IsWeekend = 0 and Date <= '2019-03-14'
 order by Date desc

所以我想我可以使用下面的查询来获取2019-02-01的正确答案

 ;with ds as
 ( 
    select top 30 Date 
    from DateDimension
    where IsWeekend = 0 and Date <= '2019-03-14'
 )
 select min(Date) from ds

但是,这不起作用。它返回我表中的第一个日期1999-12-31。

 2019-03-14
 2019-03-13
 2019-03-12
 2019-03-11
 2019-03-08
 2019-03-07
 2019-03-06
 2019-03-05
 2019-03-04
 2019-03-01
 2019-02-28
 2019-02-27
 2019-02-26
 2019-02-25
 2019-02-22
 2019-02-21
 2019-02-20
 2019-02-19
 2019-02-18
 2019-02-15
 2019-02-14
 2019-02-13
 2019-02-12
 2019-02-11
 2019-02-08
 2019-02-07
 2019-02-06
 2019-02-05
 2019-02-04
 2019-02-01

1 个答案:

答案 0 :(得分:1)

没有ORDER BY,TOP是没有意义的,因此您可以执行类似的操作

 ;with ds as
 ( 
    select top 30 Date 
    from DateDimension
    where IsWeekend = 0 and Date <= '2019-03-14'
    order by Date DESC
 )
 select min(Date) from ds;

更好的是使用ANSI语法而不是TOP:

select Date 
from DateDimension
where IsWeekend = 0 and Date <= '2019-03-14'
order by Date DESC
OFFSET 30 ROWS FETCH NEXT 1 ROW ONLY;

免责声明-由于未提供DDL和示例数据,因此未经过测试的代码

HTH