#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()
имеет компонент времени, который необходимо удалить при смещении для реализации вашей логики.