С прошлого по последний месяц

#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]