#sql #tsql #datetime
Вопрос:
Следующий код дает мне данные за последние месяцы с 1 по 30/31
_timestamp >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1, 0) and _timestamp <= DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE())-1, -0)
например, если сегодня 18/05/2021
, то это даст мне результаты с 1-04-2021 по 30/04/2021
какие изменения я могу внести, чтобы получить данные для: 1-03-2021
для 30/03/2021
и 1-02-2021
для 30/02/2021
Комментарии:
1. в марте последний день-31, а в феврале-28/29 (если високосный год).. что вы хотите сделать, переведя месяц в цифру, и вам нужен диапазон дат этого месяца?
2. Просто добавьте
-1
или-2
раньшеDATEDIFF
.3. Ваш вопрос неясен, потому что ваши даты выборки не имеют смысла.
Ответ №1:
Для дат, происходящих в течение всего месяца за два месяца до месяца текущей даты, вы можете использовать:
WHERE
timestamp >= DATEADD(month, -2, DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0))
AND
timestamp < DATEADD(month, -1, DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0))
На дату публикации этого ответа приведенное выше WHERE
положение сводилось бы к следующему:
WHERE timestamp >= '2021-03-01 00:00:00' AND timestamp < '2021-04-01 00:00:00'
Ответ №2:
Некоторые примеры:
DECLARE @date DATETIME = '12/2/2011';
SELECT
DATEFROMPARTS(YEAR(@date), MONTH(@date), 1) AS [Start],
EOMONTH(@date) AS [End];
GO
SELECT
DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) -6, 0) AS [Start 6 ago],
DATEADD(ms, -3, DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) -5, 0)) AS [End 6 ago],
CAST(DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0) AS DATE) AS [Start This],
CAST(DATEADD(ms, -3, DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) 1, 0)) AS DATE) AS [End This],
DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) 1, 0) AS [Start Next],
DATEADD(ms, -3, DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) 2, 0)) AS [End Next]