SQL Scalar UDF, чтобы получить количество дней в году - PullRequest
0 голосов
/ 01 июля 2010

Я пишу код, чтобы определить, сколько дней в году.Я пытаюсь сделать это действительно простым.Я нашел код, который я считаю очень чистым, чтобы определить високосный год.Я передаю введенную дату с помощью DATEPART (Y, @ Year) в программу високосного года и кое-что не получаю правильных результатов, поэтому я должен быть в своем коде SQL, чтобы обработать введенную дату, так как возвращается правильный бит.

Вот код високосного года:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

ALTER FUNCTION [dbo].[FN_Is_Leap_Year]
(
 -- the parameters for the function here

        @year int
)

RETURNS BIT
AS
BEGIN
RETURN (select case datepart(mm, dateadd(dd, 1, cast((cast(@year as varchar(4)) + '0228') as datetime)))
WHEN 2 THEN 1
ELSE 0  END)

END

Вот код, который я написал для обработки даты ввода и получения # дней в году:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

ALTER FUNCTION [dbo].[FN_Get_Days_In_Year]
(
    @InputDT    varchar(10)
)

RETURNS int
AS
BEGIN

DECLARE  @Result  int,
         @Year    int   


Set @Result = 
 CASE
    WHEN dbo.FN_Is_Leap_Year(Datepart(yyyy,@Year)) = 0 Then 365
    WHEN dbo.FN_Is_Leap_Year(Datepart(yyyy,@Year)) = 1 Then 366
 END


        RETURN @Result
    END

Ответы [ 2 ]

0 голосов
/ 18 июля 2012

Модифицированная версия вышеуказанного ответа:

DECLARE @year INT,
        @DaysInYear INT
SET @year = 2011

SELECT @DaysInYear = CASE DATEPART(mm, DATEADD(dd, 1, CAST((CAST(@year AS VARCHAR(4)) + '0228') AS DATETIME))) 
            WHEN 2 THEN 366 ELSE 365  END 

SELECT @DaysInYear 'DaysInYear'
0 голосов
/ 02 июля 2010

Работай !!

GO
ALTER FUNCTION [dbo].[FN_Get_Days_In_Year]
(
    @InputDT     int
)

RETURNS varchar(3)
AS
BEGIN

Declare     @Year    int,   
            @RetVal  bit,
            @Result varchar(3)

    Set @Year   = datepart(yy, @InputDT)
    Set @RetVal = dbo.FN_Is_Leap_Year(Datepart(yy,'2012'))  
    Set @Result = CASE @RetVal
                      WHEN 1 THEN 366
                      ELSE 365 
                  End    
    Return @Result
END     
...