У меня есть хранимая процедура, которая должна принимать месяц как int (1-12) и год как int. Учитывая эти два значения, я должен определить диапазон дат этого месяца. Поэтому мне нужна переменная datetime для представления первого дня этого месяца, а другая переменная datetime - последний день этого месяца. Есть ли простой способ получить эту информацию?
SQL Server 2005 Получить первую и последнюю дату для любого месяца в любом году
Ответ 1
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*/
Но что вам нужно в качестве компонента времени для последнего дня месяца? Если ваши даты имеют компоненты времени, отличные от полуночи, вам может быть лучше, просто что-то вроде
WHERE COL >= DATEADD(month,@Month-1,DATEADD(year,@Year-1900,0))
AND COL < DATEADD(month,@Month,DATEADD(year,@Year-1900,0))
Таким образом, ваш код будет продолжать работать, если вы в конечном итоге перейдете на SQL Server 2008 и более точные типы данных datetime.
Ответ 2
Первый день месяца: SELECT DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0)
Последний день месяца: SELECT DATEADD(ms, -3, DATEADD(mm, DATEDIFF(m, 0, GETDATE()) + 1, 0))
Замените значение переменной DateTime для GETDATE().
Я так давно получил от эту очень удобную страницу, которая имеет целую кучу других вычислений даты, таких как "понедельник текущей недели" "и" первый понедельник месяца ".
Ответ 3
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;
Ответ 4
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
Ответ 5
Попробуйте следующее:
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;
Ответ 6
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)
Ответ 7
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)))
Это возвращает первую дату и последнюю дату с компонентом времени.
Ответ 8
Текущий месяц последней даты:
select dateadd(dd,-day(dateadd(mm,1,getdate())),dateadd(mm,1,getdate()))
Текущий месяц 1-я Дата:
select dateadd(dd,-day(getdate())+1,getdate())