begin process at 2008 07 25 13:17:54
1 216 226 membres
190 nouveaux aujourd'hui
14 180 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

SQL SERVER - OBTENIR LA DATE DU DERNIER JOUR DU MOIS (GET LAST DAY OF MONTH).


Information sur la source

Catégorie :Fonctions Classé sous : getlastdayofmonth, lastday, dernier, jour, mois Niveau : Débutant Date de création : 21/03/2007 Date de mise à jour : 11/05/2007 09:01:57 Vu : 3 768

Note :
Aucune note

Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

Description

UDF "GetLastDayOfMonth" pour obtenir la date du dernier jour du mois avec ou sans gestion de l'heure.

Source

  • CREATE FUNCTION [dbo].[GetLastDayOfMonth](@Dte DATETIME, @AtMidnight BIT)
  • RETURNS DATETIME
  • /* Retourne la date du dernier jour du mois avec ou sans gestion de l'heure.
  • Exemples d'utilisation :
  • Select dbo.GetLastDayOfMonth(Cast('05/02/2007 12:20:49.250' As DateTime), 1) >> 2002-02-28 00:00:00.000
  • Select dbo.GetLastDayOfMonth(Cast('05/02/2007 12:20:49.250' As DateTime), 0) >> 2007-02-28 23:59:59.997
  • Select dbo.GetLastDayOfMonth(Cast('05/02/2007 12:20:49.250' As DateTime), Null) >> 2007-02-28 12:20:49.250
  • */
  • BEGIN
  • IF @AtMidnight= 0
  • RETURN DATEADD(MILLISECOND, -3, DATEADD(MONTH, DATEDIFF(MONTH, 0, @Dte) + 1, 0))
  • ELSE
  • SET @Dte=DATEADD(DAY, -1, DATEADD(MONTH, 1, DATEADD(DAY, 1-DAY(@Dte), @Dte)));
  • IF @AtMidnight= 1
  • RETURN CAST(CONVERT(CHAR(10), @Dte, 103) AS DATETIME);
  • RETURN @Dte;
  • END
  • CREATE FUNCTION [dbo].[GetLastDay](@Dte DATETIME)
  • RETURNS DATETIME
  • /* Retourne la date du dernier jour du mois sans gestion de l'heure.
  • Exemples d'utilisation (tests de validation) :
  • Select dbo.GetLastDayOfMonth(Cast('01/02/2007 12:20:49.250' As DateTime))>>2007-02-28 12:20:49.250
  • Select dbo.GetLastDayOfMonth(Cast('10/02/2007 12:20:49.250' As DateTime))>>2007-02-28 12:20:49.250
  • Select dbo.GetLastDayOfMonth(Cast('28/02/2007 12:20:49.250' As DateTime))>>2007-02-28 12:20:49.250
  • */
  • BEGIN
  • SET @Dte=DATEADD(MONTH, 1, @Dte)
  • RETURN DATEADD(DAY, -DAY(@Dte), @Dte)
  • END
CREATE FUNCTION [dbo].[GetLastDayOfMonth](@Dte DATETIME, @AtMidnight BIT)
RETURNS DATETIME
/* Retourne la date du dernier jour du mois avec ou sans gestion de l'heure.
Exemples d'utilisation :
Select dbo.GetLastDayOfMonth(Cast('05/02/2007 12:20:49.250' As DateTime), 1) >> 2002-02-28 00:00:00.000
Select dbo.GetLastDayOfMonth(Cast('05/02/2007 12:20:49.250' As DateTime), 0) >> 2007-02-28 23:59:59.997
Select dbo.GetLastDayOfMonth(Cast('05/02/2007 12:20:49.250' As DateTime), Null) >> 2007-02-28 12:20:49.250
*/
BEGIN
   IF @AtMidnight= 0
      RETURN DATEADD(MILLISECOND, -3, DATEADD(MONTH, DATEDIFF(MONTH, 0, @Dte) + 1, 0))
   ELSE 
      SET @Dte=DATEADD(DAY, -1, DATEADD(MONTH, 1, DATEADD(DAY, 1-DAY(@Dte), @Dte)));
 
   IF @AtMidnight= 1 
      RETURN CAST(CONVERT(CHAR(10), @Dte, 103) AS DATETIME);

   RETURN @Dte;
END

CREATE FUNCTION [dbo].[GetLastDay](@Dte DATETIME)
RETURNS DATETIME
/* Retourne la date du dernier jour du mois sans gestion de l'heure.
Exemples d'utilisation (tests de validation) :
Select dbo.GetLastDayOfMonth(Cast('01/02/2007 12:20:49.250' As DateTime))>>2007-02-28 12:20:49.250
Select dbo.GetLastDayOfMonth(Cast('10/02/2007 12:20:49.250' As DateTime))>>2007-02-28 12:20:49.250
Select dbo.GetLastDayOfMonth(Cast('28/02/2007 12:20:49.250' As DateTime))>>2007-02-28 12:20:49.250
*/
BEGIN
   SET @Dte=DATEADD(MONTH, 1, @Dte)
   RETURN DATEADD(DAY, -DAY(@Dte), @Dte)
END 

Conclusion

Select Cast(0 As DateTime) retourne 1900-01-01 00:00:00.000
Select DATEADD(DAY, 1-DAY(@Dte), @Dte) retourne le premier jour du mois

21 mars 2007 15:37:19 :
Err. manip. (tjs trop pressé)
03 avril 2007 13:41:20 :
Correction
05 avril 2007 10:09:42 :
Explication complémentaires
10 avril 2007 10:54:21 :
Simplification : « DATEADD(DAY, -DAY(@dte), DATEADD(MONTH, 1, @dte)) » est l'équivalent de « DATEADD(DAY, -1, DATEADD(MONTH, 1, DATEADD(DAY, 1-DAY(@Dte), @Dte))) ». Par contre, il importe de ne pas modifier l'ordre des opérations. Il faut d'abord ajouter un mois puis soustraire le nombre de jours.
10 avril 2007 12:49:38 :
Correction de la casse dans l'éventualité d'une prise en compte.
10 avril 2007 13:36:00 :
Mea culpa... la simplification n'est pas valide pour la borne supérieure (dernier jour du mois passé en paramètre).
10 avril 2007 13:42:30 :
Ponctuation
11 mai 2007 09:01:57 :
Ajout de l'algo. simplifié : GetLastDay (dernier jour du mois sans gestion de l'heure).
  • signaler à un administrateur
    Commentaire de Chrysostome le 26/03/2007 20:02:05

    C'est un problème récurrant. Nous avons une solution logique simple: Le dernier jour du mois est celui qui précède le 1er jour du mois suivant.
    C'est à dire: dernier jour de Février = (1er Mars - 1 jour).

  • signaler à un administrateur
    Commentaire de FENETRES le 27/03/2007 13:44:58

    Effectivement, cette source n'aurait que très peu intérêt (hormis algorithme moins trivial) si elle ne proposait pas la gestion de l'heure.

  • signaler à un administrateur
    Commentaire de FENETRES le 20/04/2007 18:08:17

    L'algo. est plus simple si vous n'avez pas besoin de gérer l'heure (cf. ci-dessous).

    CREATE FUNCTION [dbo].[GetLastDayOfMonth](@Dte DATETIME, @AtMidnight BIT)
    RETURNS DATETIME
    /* Retourne la date du dernier jour du mois sans gestion de l'heure.
    Tests :
    Select dbo.GetLastDayOfMonth(Cast('01/02/2007 12:20:49.250' As DateTime))>>2007-02-28 12:20:49.250
    Select dbo.GetLastDayOfMonth(Cast('10/02/2007 12:20:49.250' As DateTime))>>2007-02-28 12:20:49.250
    Select dbo.GetLastDayOfMonth(Cast('28/02/2007 12:20:49.250' As DateTime))>>2007-02-28 12:20:49.250
    */
    BEGIN
       SET @Dte=DATEADD(MONTH, 1, @Dte)
       RETURN DATEADD(DAY, -DAY(@Dte), @Dte)
    END

Ajouter un commentaire

Pub



Appels d'offres

Animation Flash alimen...
Budget : 6 000€
Creation portail video
Budget : 3 000€
Site de e-commerce
Budget : 5 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Boutique

Boutique de goodies CodeS-SourceS