如何计算SQL中月份的最后一天?

时间:2008-10-08 13:27:49

标签: sql sql-server tsql date

特别是MSSQL 2005。

9 个答案:

答案 0 :(得分:17)

这是一个解决方案,可以为您提供当月的最后一秒。您可以提取日期部分或修改它以仅返回日期。我在SQL Server 2005上测试了这个。

select dateadd( s, -1, dateadd( mm, datediff( m, 0, getdate() ) + 1, 0 ) );

要了解其工作原理,我们必须查看dateadd()datediff()函数。

DATEADD(datepart, number, date)  
DATEDIFF(datepart, startdate, enddate)

如果您只运行对datediff()的最内部调用,则从时间戳0开始获取当前月份数。

select datediff(m, 0, getdate() );  
1327

下一部分将月份数加上0加上0时间戳,为您提供下一个日历月的起点。

select dateadd( mm, datediff( m, 0, getdate() ) + 1, 0 );
2010-09-01 00:00:00.000

最后,外部dateadd()只是从下个月的开始时间戳中减去一秒,给你当前月的最后一秒。

select dateadd( s, -1, dateadd( mm, datediff( m, 0, getdate() ) + 1, 0 ) );
2010-08-31 23:59:59.000

<小时/> 这个旧的答案(下面)有一个错误,它在一个月的最后一天没有工作,这个月的天数多于下个月。我将它留在这里作为对他人的警告。

在当前日期添加一个月,然后使用DAY和DATEADD函数减去应用于当前日期的DAY函数返回的值。

dateadd(day, -day(getdate()), dateadd(month, 1, getdate()))

答案 1 :(得分:4)

SELECT DATEADD(M, DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP), '1990-01-31T00:00:00.000')

说明:

一般方法:使用时间功能。

SELECT '1990-01-01T00:00:00.000', '1990-01-31T00:00:00.000'

这些是DATETIME文字,是同一个31天月份的第一天和最后一天的第一次颗粒。选择哪个月完全是任意的。

SELECT DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP)

这是参考月份的第一天与当前时间戳之间的整月差异。我们称之为@calc

SELECT DATEADD(M, @calc, '1990-01-31T00:00:00.000')

这会将@calc个月的颗粒添加到参考月的最后一天,其结果是当前时间戳“四舍五入”到其当月的最后一天。 Q.E. d。

答案 2 :(得分:3)

试试这个:

DATEADD (DAY, -1, DATEADD (MONTH, DATEDIFF (MONTH, 0, CURRENT_TIMESTAMP) + 1, 0)

答案 3 :(得分:2)

他们的关键点是,如果你可以获得当月的第一天,上个月的最后一天和当月的最后一天。

以下是逐步编写查询的方法:

在SQL Server日期从1901/01/01(日期0)开始,到目前为止,每个月都可以用数字标识。第12个月是1902年的第一个月意味着1月。第1200个月是2001年1月。类似地,每天可以通过唯一编号分配,例如,日期0是1901/01/01。日期31是1901年2月1日,因为1901年1月从0开始。

查找当月的第一天(当前日期或指定日期)

  1. 首先,我们需要检查自0(1901/01/01)以来已经过了多少个月。 SELECT DATEDIFF(MM,0,GETDATE())
  2. 添加相同数量的月份0(1901/01/01)
      
        

    SELECT DATEADD(MM,DATEDIFF(MM,0,GETDATE()),0)

  3.     

    然后我们将获得当月的第一天(当前日期或给定日期)

      

    获得上个月的最后一天

    我们需要从当月第一天减去一秒

      
        

    SELECT DATEADD(SS,-1,DATEADD(MM,DATEDIFF(MM,0,GETDATE()),0))

      

    获得当月的最后一天

    为了获得当月的第一天,我们检查了自0(1901/01/01)以来已经过了多少个月。如果我们添加另一个月以及从日期0开始的总月数,然后添加日期为0的总月份,我们将获得下个月的第一天。

    SELECT DATEADD(MM, DATEDIFF(MM,0,GETDATE())+1,0)
    

    如果我们在下个月的第一天到达当月的最后一天,我们需要减去一秒。

      
        

    SELECT DATEADD(SS,-1,DATEADD(MM,DATEDIFF(MM,0,GETDATE())+ 1,0))

      

    希望这会有所帮助。

答案 4 :(得分:1)

使用SQL2005,您无权访问有用的函数EOMONTH(),因此您必须自己计算。

  

这个简单的功能与 EOMONTH

类似
CREATE FUNCTION dbo.endofmonth(@date DATETIME= NULL)
RETURNS DATETIME
BEGIN
RETURN DATEADD(DD, -1, DATEADD(MM, +1, DATEADD(DD, 1 - DATEPART(DD, ISNULL(@date,GETDATE())), ISNULL(@date,GETDATE()))))
END

执行查询:

SELECT dbo.endofmonth(DEFAULT)  --Current month-end date
SELECT dbo.endofmonth('02/25/2012') --User-defined month-end date

答案 5 :(得分:0)

答案 6 :(得分:0)

DECLARE
  @Now datetime,
  @Today datetime,
  @ThisMonth datetime,
  @NextMonth datetime,
  @LastDayThisMonth datetime

SET @Now = getdate()
SET @Today = DateAdd(dd, DateDiff(dd, 0, @Now), 0)
SET @ThisMonth = DateAdd(mm, DateDiff(mm, 0, @Now), 0)
SET @NextMonth = DateAdd(mm, 1, @ThisMonth)
SET @LastDayThisMonth = DateAdd(dd, -1, @NextMonth)

有时你确实需要本月的最后一天,但你经常需要的是描述本月的时间间隔。这是描述本月时间间隔的最佳方式

WHERE @ThisMonth <= someDate and someDate < @NextMonth

答案 7 :(得分:0)

为了完整起见,在Oracle中你会做类似......

的事情
select add_months(trunc(sysdate,'MM'),1) ...

select last_day(sysdate)+1 ...

答案 8 :(得分:0)

DATEADD(dd, -1, DATEADD(mm, +1, DATEADD(dd, 1 - DATEPART(dd, @myDate), @myDate)))