Выбор динамической даты в диапазоне дат sql

#sql #datetime #where-clause #date-arithmetic

#sql #datetime #where-предложение #дата-арифметика

Вопрос:

Это диапазон дат моего запроса:

 WHERE 
    date BETWEEN 20190101 AND [here date should come as last year YTD -1]
  

Например, если мы используем этот запрос сегодня (20201106) (формат: ггггммдд), то 2-я дата должна быть 20191105 .

Для большей ясности: когда я запускаю этот запрос сегодня (20201106), мой запрос должен получать результаты из диапазона дат:

 WHERE 
    date BETWEEN 20190101 AND 20191105
  

Когда я завтра выполню этот запрос (20201107), мой запрос должен получить результаты из диапазона дат:

 WHERE 
    date BETWEEN 20190101 AND 20191106
  

Как я могу это сделать?

Кто-нибудь может помочь?

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

1. Пожалуйста, добавьте тег вашей платформы базы данных, поскольку функции даты различны в каждой СУБД. В общем, вам следует поискать ссылку на функции даты в вашей СУБД и найти подходящую функцию для использования.

Ответ №1:

вы можете использовать dateadd() с getdate()

 DATEADD(year,-1, GETDATE()) 
  

или другая функция, которая может получать текущее время базы данных, но это должно работать.
также не забудьте использовать convert() , чтобы изменить формат даты на тот, который вы хотите.

Ответ №2:

 WHERE 
DATEADD(YEAR,-1, GETDATE()) -- One Day Before Today in the Last Year
AND 
DATEADD(yy, DATEDIFF(yy, 0, DATEADD(YEAR,-1, GETDATE())), 0) AS StartOfYear -- The Day 1 of the Last Year
  

Ответ №3:

Я бы сформулировал это как:

 where date >= datefromparts(year(getdate()) - 1, 1, 1)
  and date <  dateadd(year, -1, convert(date, getdate()))
  

Это фильтрует с начала прошлого года и 1 год и 1 день назад.

Обратите внимание, что я изменил стратегию фильтрации, чтобы использовать полуоткрытые интервалы, а не between . Это как-то более гибко, поскольку оно будет правильно обрабатывать компонент времени в in date , если таковой имеется, и упрощает логику смещения.

Также обратите внимание, что getdate() имеет компонент времени, который необходимо удалить при смещении для реализации вашей логики.