2012-11-26 2 views
0

Désolé d'être un problème les gars. J'ai été chargé d'effectuer une révision de code à un emplacement client et l'ordinateur portable qui m'est remis n'a pas SQL installé. Alors que je suis en attente de l'installation se produise, a voulu obtenir occupé à regarder le code et suis tombé sur ce petit bijouQuelqu'un pourrait valider cette fonction, s'il vous plaît

CREATE FUNCTION [dbo].[Uf_GetTotalDaysInMonth] 
(
    -- Add the parameters for the function here 
    @anydateofMonth datetime 
) 
RETURNS int 
AS 
BEGIN 
    -- Declare the return variable here 
    DECLARE @totalDaysInMonth int 
    -- Add the T-SQL statements to compute the return value here 

     DECLARE @givendate datetime 
     SET @givendate = STR(Year(@givendate)) + '-' + STR(Month(@givendate) + 1) + '-01' 

     select @totalDaysInMonth = datepart(dd, dateadd(day, -1, @givendate)) 

    -- Return the result of the function 
    RETURN @totalDaysInMonth 

END 

Ignorant l'utilisation d'inutile variable supplémentaire, je crois que cette fonction se bloque en Décembre

STR(Month(@givendate) + 1) 

évaluera à 13 et donnera une erreur de date hors champ. Quelqu'un pourrait-il valider cela pour moi?

+0

Juste Pour votre information, ils ont créé un site dans SE pour demander aux gens de revoir demande semblable à ceci: http://codereview.stackexchange.com –

+0

LOL qui est assez mauvais. L'idée n'est pas mauvaise: trouvez la date de début du mois suivant, soustrayez-en une et prenez la date comme les jours du mois. Mais l'exécution est très imprudente. –

Répondre

1

Vous vill obtenir erreur dans votre fonction lorsque passe @anydateofMonth date Décembre. Vous pouvez utiliser ceci:

CREATE FUNCTION [dbo].[Uf_GetTotalDaysInMonth] 
(
    -- Add the parameters for the function here 
    @anydateofMonth datetime 
) 
RETURNS int 
AS 
BEGIN 
    DECLARE @nextMonth datetime 
    SET @nextMonth = dateadd(m, 1, @anydateofMonth) 
    RETURN (SELECT Day(dateadd(d, -Day(@nextMonth), @nextMonth))) 
    END 
Questions connexes