2010-10-12 4 views
10

У меня есть хранимая процедура, которая должна принимать месяц как int (1-12) и год как int. Учитывая эти два значения, я должен определить диапазон дат этого месяца. Поэтому мне нужна переменная datetime для представления первого дня этого месяца, а другая переменная datetime - последний день этого месяца. Есть ли простой способ получить эту информацию?SQL Server 2005 Получить первую и последнюю дату для любого месяца в любом году

ответ

14
DECLARE @Month int 
DECLARE @Year int 

set @Month = 2 
set @Year = 2004 

select DATEADD(month,@Month-1,DATEADD(year,@Year-1900,0)) /*First*/ 

select DATEADD(day,-1,DATEADD(month,@Month,DATEADD(year,@Year-1900,0))) /*Last*/ 

Но что вам нужно для компонента времени для последнего дня месяца? Если DateTimes другие полуночи компоненты времени вы вполне можете быть лучше просто делать что-то вроде

WHERE COL >= DATEADD(month,@Month-1,DATEADD(year,@Year-1900,0)) 
    AND COL < DATEADD(month,@Month,DATEADD(year,@Year-1900,0)) 

Таким образом, ваш код будет продолжать работать, если вы в конечном итоге перейти на SQL Server 2008 и большей точности даты и времени типов данных.

+0

спасибо. Это сработало. Я предпочел этот ответ, поскольку он кажется самым чистым. – Ristogod

18

Первый день месяца:SELECT DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0)

Последний день месяца:SELECT DATEADD(ms, -3, DATEADD(mm, DATEDIFF(m, 0, GETDATE()) + 1, 0))

Заменитель значение переменной DateTime для GETDATE().

Я получил это давно от this very handy page, который имеет целую кучу других расчетных дат, таких как «понедельник текущей недели» и «первый понедельник месяца».

+0

Это сработало. Хотя я выбрал другой ответ, поскольку я предпочел его синтаксис. Связанная вами страница - отличный источник информации. Благодарю. – Ristogod

1
DECLARE @Month int; 
DECLARE @Year int; 
DECLARE @FirstDayOfMonth DateTime; 
DECLARE @LastDayOfMonth DateTime; 

SET @Month = 3 
SET @Year = 2010 

SET @FirstDayOfMonth = CONVERT(datetime, CAST(@Month as varchar) + '/01/' + CAST(@Year as varchar)); 
SET @LastDayOfMonth = DATEADD(month, 1, CONVERT(datetime, CAST(@Month as varchar)+ '/01/' + CAST(@Year as varchar))) - 1; 
+0

Это сработало. Хотя я выбрал другой ответ, поскольку я предпочел его синтаксис и неприменение конвертирования. Благодарю. – Ristogod

1
DECLARE @Month INTEGER 
DECLARE @Year INTEGER 
SET @Month = 10 
SET @Year = 2010 

DECLARE @FirstDayOfMonth DATETIME 
DECLARE @LastDayOfMonth DATETIME 

SET @FirstDayOfMonth = Str(@Year) + RIGHT('0' + Str(@Month), 2) + '01' 
SET @LastDayOfMonth = DATEADD(dd, -1, DATEADD(mm, 1, @FirstDayOfMOnth)) 
SELECT @FirstDayOfMonth, @LastDayOfMonth 
+0

Это сработало. Хотя я выбрал другой ответ, поскольку я предпочел его синтаксис и неприменение права. Благодарю. – Ristogod

1

Попробуйте это:

Declare @month int, @year int; 
Declare @first DateTime, @last DateTime; 
Set @month=10; 
Set @year=2010; 
Set @first=CAST(CAST(@year AS varchar) + '-' + CAST(@month AS varchar) + '-' + '1' AS DATETIME); 
Set @last=DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@first)+1,0)); 

SELECT @first,@last; 
+0

Это сработало. Хотя я выбрал другой ответ, поскольку я предпочел его синтаксис и неприменение кастинга. Благодарю. – Ristogod

1
select [FirstDay Of The Month] as Text ,convert(varchar,dateadd(d,-(day(getdate()-1)),getdate()),106) 'Date' 
union all 
select [LastDay Of The Month], convert(varchar,dateadd(d,-day(getdate()),dateadd(m,1,getdate())),106) 
0

Текущий месяц Последние Дата:

select dateadd(dd,-day(dateadd(mm,1,getdate())),dateadd(mm,1,getdate())) 

Текущий месяц первый Дата:

select dateadd(dd,-day(getdate())+1,getdate()) 
1
DECLARE @Month int = 3, @Year int = 2016 
DECLARE @StartDate DATETIME 
DECLARE @EndDate DATETIME 

-- First date of month 
SET @StartDate = DATEADD(MONTH, @Month-1, DATEADD(YEAR, @Year-1900, 0)); 
-- Last date of month 
SET @EndDate = DATEADD(SS, -1, DATEADD(MONTH, @Month, DATEADD(YEAR, @Year-1900, 0))) 

Это возвращает первую дату и последнюю дату со временем.