выбор даты n дней назад, исключая выходные - PullRequest
0 голосов
/ 14 марта 2019

У меня есть таблица с ежедневными датами, начиная с 31 декабря 1999 года по 31 декабря 2050 года, исключая выходные.

Скажите, учитывая конкретную дату, для этого примера давайте использовать 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 Ответ

1 голос
/ 14 марта 2019

TOP не имеет смысла без ORDER BY, поэтому вы могли бы сделать что-то вроде

 ;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

...