none
est-ce que c'est un bug (function DATEADD)? RRS feed

  • Discussion générale

  • hello,

    je ne sais pas si quelqu'un a déjà rencontré ce problème ou pas, je vais quand même vous le parler.

    je travaille sous SQL Server 2005 64bits Entreprise sous Windows server 2003

    j'ai effectué des requêtes suivantes, mais les résultats me surprisent!!!

    --query :

    declare @start datetime, @end datetime

    set @start = '20090101'
    set @end = dateadd(ms, -3, dateadd(month, 1, @start))

    while @start < '20090401'
    begin
            select @start, @end
            set @start = dateadd(month, 1, @start)
            set @end = dateadd(month, 1, @end)
    end

    -- result:

    2009-01-01 00:00:00.000      2009-01-31 23:59:59.997

    2009-02-01 00:00:00.000      2009-02-28 23:59:59.997

    2009-03-01 00:00:00.000      2009-03-28 23:59:59.997

    voilà, ma question, si la function dateadd a bien détecté le nombre de jour du Févier, pourquoi ce n'est pas la même logique pour le mois suivant? est-ce que c'est un bug dans la function?

    je vous remercie d'avance! 
    mercredi 17 mars 2010 23:42

Toutes les réponses

  • Bonjour à toi,
    non non cela n'a rien d'un Bug et cela n'a absolument rien a voir avec les jours fériés : tu indiques dans ta boucle "set @end = dateadd(month, 1, @end)". Or stricto facto si tu ajoutes un à la valeur du mois de la date "2009-02-28" cela donne bien "2009-03-28".
    Si tu veux donc que ta boucle te donne le 1er et dernier jour de chaque mois il te faut donc changer ton algo de la sorte :

    declare @start datetime, @end datetime

    set @start = '20090101'
    set @end = dateadd(ms, -3, dateadd(month, 1, @start))

    while @start < '20090401'
    begin
            select @start, @end
            set @start = dateadd(month, 1, @start)
            set @end = dateadd(ms, -3, dateadd(month, 1, @start))
    end

    It should work  :)
    J'espère avoir répondu à ta question

    Cordialement,

    Fred.
    jeudi 18 mars 2010 16:46
  • Bonjour Fred (Cepheus),

    merci de ta modification est très bien, j'avais l'utilisé aussi. mais ma question n'est pas là, je m'explique, 2009-02-28 23:59:59.997 est bien dernier moment du mois février (sauf 29/02 :)) en SQL, si on ajoute 1 mois sur cette date (plustôt cette heure), je m'attentais le fin du mois prochain (le même moment), c'est à dire 2009-03-31 23:59:59.997, oui... je suis d'accord si on regard simplement sur la date, en général on se trouve sur la même date du mois prochain si on ajoute un mois sur une date, mais j'aime bien comprendre dans mon cas précis c'est quoi la valeur exacte d'un mois, au niveau system, comment s'est calculé?


    cordialement,

    Chengpeng
     
    jeudi 18 mars 2010 22:05