2010-07-01 8 views
-1

Je code pour déterminer combien de jours dans une année. J'essaie de le garder vraiment simple. J'ai trouvé un code que je trouve très propre pour déterminer une année bissextile. Je passe la date saisie en utilisant DATEPART (Y, @ Année) au programme d'année bissextile et d'autres comment ne pas obtenir les bons résultats, donc je dois être dans mon code SQL pour traiter la date d'entrée que le bon bit est retourné.SQL UDF scalaire pour obtenir le nombre de jours dans l'année

Voici le code pour l'année bissextile:

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 

Voici le code que j'ai écrit pour traiter la date d'entrée & obtenir les # jours en un an:

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 
+0

dans la dernière section de code, pourquoi appeler la fonction (dbo.FN_Is_Leap_Year) 2 fois dans la déclaration 'de CASE'? vous devez utiliser 'CASE dbo.FN_Is_Leap_Year (Datepart (aaaa, @ année)) QUAND 0 ALORS 365 ELSE 366 END'. Heck, je jetterais la première fonction et juste tirer sa ligne de code dans le 'CASE'. –

+0

'SELECT 1 + DATEDIFF (jour, CAST (@year AS VARCHAR (4)) + '-01-01', CAST (@year AS VARCHAR (4)) + '-12-31');'? – pilcrow

Répondre

0

obtenu ce travail !!

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  
+0

Bien. Je ne comprends pas ce qui se passe avec tes types. Il devrait retourner un int non varchar (3) et accepter un datatype de date. Aussi, sauf si vous utilisez ceci dans beaucoup d'endroits je renoncerais probablement à l'UDF pour cela et j'utiliserais quelque chose comme 'CASE WHEN Col1% 4> 0 puis 365 WHEN Col1% 400 = 0 alors 366 WHEN Col1% 100 = 0 PUIS 365 ELSE 366 END' –

+0

Non je me trompe, j'ai validé le bit passe bien, mais le code ne revient toujours pas correctement, toute aide est appréciée. GO ALTER FUNCTION [DBO]. [FN_Get_Days_In_Year] ( @InputDT \t int) RETOURS \t varchar (3) AS BEGIN déclarer @Year int, \t \t @RetVal \t bit, \t \t @Result varchar (3) Set @Year = datepart (yy @InputDT) Set @RetVal = dbo.FN_Is_Leap_Year (DATEPART (yy @ Année)) Set @Result = \t cas Lorsque @RetVal = 1, 365 366 Else \t \t fin \t \t \t \t Retour @Result FIN – JMS49

+0

Martin, je suis désolé, je ne suis pas tout à fait suivre votre déclaration de cas peux-tu élaborer? – JMS49

0

version modifiée de la réponse ci-dessus:

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'