выбор даты n дней назад без учета выходных

#sql #sql-server #sql-server-2012

#sql #sql-сервер #sql-server-2012

Вопрос:

У меня есть таблица с ежедневными датами, начиная с 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:

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

Комментарии:

1. Спасибо! Я использовал синтаксис ANSI в качестве ВЕРХНЕГО, даже при заказе by все равно возвращалась первая дата в моей таблице