TSQL只需要返回一个月的最后一天,我该如何删除年,月和月;时间?

时间:2010-07-06 23:10:10

标签: tsql date datetime sql-drop

我正在T-SQL中编写一个函数,无论日期输入如何,都会返回该月的最后一天。

这是我的代码:

Alter Function dbo.FN_Get_Last_Day_in_Month2
(@FN_InputDt    Datetime)
Returns smalldatetime
as 
Begin

Declare @Result  smalldatetime
Set    @Result =

       case when @FN_InputDt <> 01-01-1900 then 
       DATEADD(m, DATEDIFF(M, 0,@FN_InputDt)+1, -1)
       Else 0 End

Return @Result

End 

代码无法正常工作,这是一个显示不良行为的测试:

SELECT dbo.fn_get_last_day_in_month (07-05-2010)

这是(不正确的)结果:

2010-07-31 00:00:00

4 个答案:

答案 0 :(得分:9)

什么是07-05-2010 ... 5月7日或7月5日?您需要使用安全日期格式,请查看Setting a standard DateFormat for SQL Server

来自How to find the first and last days in years, months etc

的示例
DECLARE @d DATETIME
SET @d = '20100705'  -- notice ISO format

SELECT
    DATEADD(yy, DATEDIFF(yy, 0, @d), 0) AS FirstDayOfYear,
    DATEADD(yy, DATEDIFF(yy, 0, @d)+1, -1) AS LastDayOfYear,
    DATEADD(qq, DATEDIFF(qq, 0, @d), 0) AS FirstDayOfQuarter,
    DATEADD(qq, DATEDIFF(qq, 0, @d)+1, -1) AS LastDayOfQuarter,
    DATEADD(mm, DATEDIFF(mm, 0, @d), 0) AS FirstDayOfMonth,
    DATEADD(mm, DATEDIFF(mm, 0, @d)+1, -1) AS LastDayOfMonth,
    @d - DATEDIFF(dd, @@DATEFIRST - 1, @d) % 7 AS FirstDayOfWeek,
    @d - DATEDIFF(dd, @@DATEFIRST - 1, @d) % 7 + 6 AS LastDayOfWeek

仅适用于日期使用日或日期部分

 select DAY(getdate()),
     DATEPART(dd,GETDATE())

答案 1 :(得分:1)

将返回值强制转换为SQL日期时间类型,然后调用“DAY”函数以整数形式获取日期。请参阅此处的函数参考:

http://msdn.microsoft.com/en-us/library/ms176052.aspx

不确定您使用的是哪个数据库,但这应该是所有数据库的标准功能。

答案 2 :(得分:0)

我会返回DATETIME,过去我在使用SMALLDATETIME时遇到了麻烦。

DECLARE @Result DATETIME

SET @Result = DATEADD(m , 1, @FN_Input);

RETURN CAST(FLOOR(CAST(DATEADD(d, DATEPART(d, @Result) * -1, @Result) AS FLOAT)) AS DATETIME)

另外,我认为你可能是SQL完全无视日期格式化的受害者。总是,总是,总是在键入字符串时测试SQL函数使用以下格式;

'2010年7月5日'

您的功能可能有效,但它将您的日期解释为7月5日 - 而不是5月7日。

答案 3 :(得分:0)

DECLARE @date DATETIME = '20130624';
SELECT Day(EOMONTH ( @date )) AS LastDay;
GO