TSQL должен возвращать только последний день месяца, как мне указать год, месяц и время? - PullRequest
1 голос
/ 07 июля 2010

Я пишу функцию в 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 ]

9 голосов
/ 07 июля 2010

Что такое 07-05-2010 ... 7 мая или 5 июля? Вам необходимо использовать безопасный формат даты, взгляните на Установка стандартного формата даты для SQL Server

пример из Как найти первые и последние дни в годах, месяцах и т. Д.

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

только для дня использования или даты. 1012 *

 select DAY(getdate()),
     DATEPART(dd,GETDATE())
1 голос
/ 07 июля 2010

Приведите возвращаемое значение к типу SQL datetime, а затем вызовите функцию «ДЕНЬ», чтобы получить день в виде целого числа.См. Ссылку на функцию здесь:

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

Не уверен, какую базу данных вы используете, но это должно быть стандартной функцией для всех баз данных.

0 голосов
/ 25 июня 2013
DECLARE @date DATETIME = '20130624';
SELECT Day(EOMONTH ( @date )) AS LastDay;
GO
0 голосов
/ 07 июля 2010

Я бы вернул 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 используйте следующий формат:

'05 июля 2010'

Ваша функция, вероятно, работает, но она интерпретировала вашу дату как 5 июля, а не 7 мая.

...