特别是MSSQL 2005。
答案 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开始。
查找当月的第一天(当前日期或指定日期)
SELECT DATEADD(MM,DATEDIFF(MM,0,GETDATE()),0)
然后我们将获得当月的第一天(当前日期或给定日期)
获得上个月的最后一天
我们需要从当月第一天减去一秒
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)))