Получить диапазон дат за текущий месяц? - PullRequest
3 голосов
/ 24 августа 2011

Я хотел бы создать инструкцию SQL для последующего использования в моем коде, которая получает диапазон дат для текущего месяца.

Пример: это август, поэтому диапазон дат будет

StartDate = 08/01/11
EndDate = 08/31/11

однако, если это был февраль

StartDate = 02/01/11
EndDate = 02/28/11

Select * 
from mytable 
where (check_date >= StartDate) AND (check_date <= EndDate)

спасибо за любую помощь, которую вы можете оказать

Ответы [ 4 ]

11 голосов
/ 24 августа 2011

Вы можете найти начало этого месяца с помощью месяца с нуля. Последний день месяца - один месяц спустя, минус один день:

select  dateadd(month,datediff(month,0,getdate()),0)
,       dateadd(day,-1,dateadd(month,datediff(month,-1,getdate()),0))

Это печатает:

1-aug-2011    31-aug-2011
1 голос
/ 31 августа 2013

Мне нужна была очень похожая вещь, чтобы получить диапазон дат месяца с определенной датой, который можно было использовать в поиске SQL - это означает, что не только даты должны быть правильными, но время должно быть с 00:00:00 до 23:59: 59 Если в 24-часовой системе, но это просто вопрос отображения формата DATETIME, она будет работать и с 12-часовой системой.

Может быть, это будет кому-то полезно.Это решение основано на ответе Andomar:

-- Parameter date, which must be given to this code
DECLARE @date DATETIME
SET @date = GETDATE() -- for testing purposes initializing some date

-- Declare @from and to date range variables
DECLARE @from DATETIME
DECLARE @to DATETIME

-- This code line is based on Andomar's answer
SET @from = DATEADD(month,DATEDIFF(month, 0, @date),0) 

-- Just simply to variable @from adds 1 month, minus 1 second
SET @to = DATEADD(second, -1, DATEADD(month, 1, @date))

-- Result
SELECT @from, @to

Вы получите результат, подобный 2012.01.01 00:00:00 - 2012.01.31 23: 59: 59 .

0 голосов
/ 24 августа 2011

Вы можете создать функцию, которая возвращает дату окончания для данной даты.

Таким образом, вы можете передать дату начала, и она будет выглядеть так:

WHEN(MONTH(@date) IN (1, 3, 5, 7, 8, 10, 12)) THEN 31
WHEN(MONTH(@date) IN (4, 6, 9, 11)) THEN 30
ELSE 
    CASE 
       WHEN (YEAR(@date) % 4 = 0
       AND YEAR(@date) % 100 != 0)
       OR (YEAR(@date) % 400  = 0)
       THEN 29
        ELSE 28
END
0 голосов
/ 24 августа 2011

Если вам нужен диапазон месяцев только для проверки, относится ли «check_date» к определенному месяцу, вы, возможно, можете использовать условие типа

month(Check_date) = @Month and year(Check_date) = @Year
...