我曾在Oracle中使用LAST_DAY()函数,用法如下:
Last_Day( to_date( '$pay_first_day' , 'YYYY-mm-dd') )
我该怎么在SQL Server 2008 R2数据库中实现同样的结果呢?
我曾在Oracle中使用LAST_DAY()函数,用法如下:
Last_Day( to_date( '$pay_first_day' , 'YYYY-mm-dd') )
我该怎么在SQL Server 2008 R2数据库中实现同样的结果呢?
DECLARE @Date DATETIME
SELECT @Date = GETDATE()
SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, @Date) + 1, 0) - 1
SQL Server 2012引入了一个新的日期函数,称为EOMONTH,它返回包含指定日期的月份的最后一天,还可以选择性地添加偏移量。
EOMONTH ( <start_date> [, <month_to_add> ] )
For instance
select EOMONTH('01/07/2018')
Would return
2018-01-31
-- 为了实现无缝过渡,将答案包装在一个函数中。
CREATE FUNCTION [dbo].[LAST_DAY]
(
@inDate DATETIME
)
RETURNS DATETIME
AS
BEGIN
RETURN DATEADD(MONTH, DATEDIFF(MONTH, 0, @inDate) + 1, 0) - 1
END
-- TO TEST: SELECT dbo.LAST_DAY(getDate()) as LastDayOfThisMonth
-- 注意:如果这篇文章对您有所帮助,请将其标记为答案,而不是之前的那篇。
请尝试一下这个,它应该按预期工作:
SELECT DATEADD (DAY, -1, DATEADD (MONTH, DATEDIFF (MONTH, 0, '$pay_first_day') + 1, 0))
如果你的$pay_first_day
在二月,它将返回给定日期相应的最后一天,格式为:'2013-02-28 00:00:00.000'
;如果你的$pay_first_day
在四月,它将返回'2013-04-30 00:00:00.000'
。
这里有两个用于获取月初和月末的UDF函数。
CREATE FUNCTION dbo.End_of_month (@Date datetime)
RETURNS datetime AS
BEGIN
DECLARE @ret datetime
SET @Ret=DATEADD(DAY,-DAY(@Date)+1,@Date);
SET @Ret=DATEADD(Month,1,@Ret);
SET @Ret=DATEADD(Day,-1,@Ret);
RETURN(@Ret)
END
CREATE FUNCTION dbo.Begin_of_month (@Date datetime)
RETURNS datetime AS
BEGIN
DECLARE @ret datetime
SET @Ret=DATEADD(DAY,-DAY(@Date)+1,@Date);
RETURN(@Ret)
END