SQL Server 2005获取任何年份中任何月份的第一个和最后一个日期

时间:2010-10-12 15:36:55

标签: sql sql-server sql-server-2005 tsql datetime

我有一个存储过程,必须接受一个月为int(1-12),一年为int。鉴于这两个值,我必须确定该月的日期范围。所以我需要一个datetime变量来表示该月的第一天,另一个datetime变量来表示该月的最后一天。有没有一种相当简单的方法来获取这些信息?

9 个答案:

答案 0 :(得分:20)

每月的第一天: SELECT DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0)

一个月的最后一天: SELECT DATEADD(ms, -3, DATEADD(mm, DATEDIFF(m, 0, GETDATE()) + 1, 0))

替换GETDATE()的DateTime变量值。

我很久以前就从this very handy page获得了这一点,其中有一大堆其他日期计算,例如“当周的星期一”和“本月的第一个星期一”。

答案 1 :(得分:15)

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 :(得分:2)

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;

答案 3 :(得分:2)

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

答案 4 :(得分:2)

试试这个:

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;

答案 5 :(得分:2)

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)

答案 6 :(得分:2)

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)))

这将返回带有时间组件的第一个日期和最后一个日期。

答案 7 :(得分:1)

当前月份的最后日期:

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

当月第1日:

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

答案 8 :(得分:0)

您可以使用DATEFROMPARTS声明一个月的第一天,并使用EOMONTH来从该第一日期导出该月的最后一个日期。

DECLARE @Month INT = 1
DECLARE @Year INT = 2020

DECLARE @FromDate DATE = DATEFROMPARTS(@Year, @Month, 1)
DECLARE @ToDate DATE = EOMONTH(@FromDate)

SELECT @FromDate MonthFirstDate, @ToDate MonthLastDate