Beaucoup de participants au forum SQL Server se compliquent la vie avec des calculs bizarres, à trouver le premier ou dernier jour d’un index temporel, comme celui d’une semaine, d’un mois, ou d’un trimestre.
Ces calculs se font souvent à base d’extractions de sous-chaînes après avoir converti une date en varchar(n), et on aboutit donc à des choses abominables.
Voici donc une série de calculs de valeurs, uniquement à base de fonctions de date …
Oui, les dates se manipulent avec des fonctions de date, et non pas avec des fonctions de chaîne !
J’en profite au passage pour rappeler mon billet sur le choix des types de données …
La majorité des valeurs calculées ci-dessous repose sur la différence en semaines, mois, trimestres, …, entre la date courante et le 1er Janvier 1900.
En effet, on peut introduire directement cette date par un zéro dans les fonctions de date, que SQL Server caste automatiquement, et qui donne cette date.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | ------------------------------- -- Nicolas Souquet - 29/03/2011 ------------------------------- SELECT --*** Semaine DATEADD(week, DATEDIFF(week, 0, GETDATE()) - 1, 0) AS premier_jour_de_la_semaine_precedente , DATEADD(week, DATEDIFF(week, 0, GETDATE()), 0) AS premier_jour_de_la_semaine_courante , DATEADD(week, DATEDIFF(week, 0, GETDATE()) + 1, 0) AS premier_jour_de_la_semaine_prochaine --- , DATEADD(day, -1, DATEADD(week, DATEDIFF(week, 0, GETDATE()), 0)) AS dernier_jour_de_la_semaine_precedente , DATEADD(day, -1, DATEADD(week, DATEDIFF(week, 0, GETDATE()) + 1, 0)) AS dernier_jour_de_la_semaine_courante , DATEADD(day, -1, DATEADD(week, DATEDIFF(week, 0, GETDATE()) + 2, 0)) AS dernier_jour_de_la_semaine_prochaine --*** Mois , DATEADD(month, DATEDIFF(month, 0, GETDATE()) - 1, 0) AS premier_jour_du_mois_precedent , DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0) AS premier_jour_du_mois_courant , DATEADD(month, DATEDIFF(month, 0, GETDATE()) + 1, 0) AS premier_jour_du_mois_prochain --- , DATEADD(day, -1, DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)) AS dernier_jour_du_mois_precedent , DATEADD(day, -1, DATEADD(month, DATEDIFF(month, 0, GETDATE()) + 1, 0)) AS dernier_jour_du_mois_courant , DATEADD(day, -1, DATEADD(month, DATEDIFF(month, 0, GETDATE()) + 2, 0)) AS dernier_jour_du_mois_prochain --*** Trimestre , DATEADD(quarter, DATEDIFF(quarter, 0, GETDATE()) - 1, 0) AS premier_jour_du_trimestre_precedent , DATEADD(quarter, DATEDIFF(quarter, 0, GETDATE()), 0) AS permier_jour_du_trimestre_courant , DATEADD(quarter, DATEDIFF(quarter, 0, GETDATE()) + 1, 0) AS premier_jour_du_trimestre_prochain --- , DATEADD(day, -1, DATEADD(quarter, DATEDIFF(quarter, 0, GETDATE()), 0)) AS dernier_jour_du_trimestre_precedent , DATEADD(day, -1, DATEADD(quarter, DATEDIFF(quarter, 0, GETDATE()) + 1, 0)) AS dernier_jour_du_trimestre_courant , DATEADD(day, -1, DATEADD(quarter, DATEDIFF(quarter, 0, GETDATE()) + 2, 0)) AS dernier_jour_du_trimestre_prochain --*** Semestre , DATEADD(month, ((DATEDIFF(quarter, 0, GETDATE()) / 2) * 6) - 6, 0) AS premier_jour_du_semestre_precedent , DATEADD(month, (DATEDIFF(quarter, 0, GETDATE()) / 2) * 6, 0) AS premier_jour_du_semestre_courant , DATEADD(month, ((DATEDIFF(quarter, 0, GETDATE()) / 2) * 6) + 6, 0) AS premier_jour_du_semestre_prochain --- , DATEADD(day, -1, DATEADD(month, (DATEDIFF(quarter, 0, GETDATE()) / 2) * 6, 0)) AS dernier_jour_du_semestre_precedent , DATEADD(day, -1, DATEADD(month, ((DATEDIFF(quarter, 0, GETDATE()) / 2) * 6) + 6, 0)) AS dernier_jour_du_semestre_courant , DATEADD(day, -1, DATEADD(month, ((DATEDIFF(quarter, 0, GETDATE()) / 2) * 6) + 12, 0)) AS dernier_jour_du_semestre_prochain --*** Annee , DATEADD(year , DATEDIFF(year, 0, GETDATE()) - 1, 0) AS premier_jour_annee_precedente , DATEADD(year , DATEDIFF(year, 0, GETDATE()), 0) AS premier_jour_annee_courante , DATEADD(year , DATEDIFF(year, 0, GETDATE()) + 1, 0) AS premier_jour_annee_suivante --- , DATEADD(day, -1, DATEADD(year , DATEDIFF(year, 0, GETDATE()), 0)) AS dernier_jour_annee_precedente , DATEADD(day, -1, DATEADD(year , DATEDIFF(year, 0, GETDATE()) + 1, 0)) AS dernier_jour_annee_courante , DATEADD(day, -1, DATEADD(year , DATEDIFF(year, 0, GETDATE()) + 2, 0)) AS dernier_jour_annee_suivante --*** Siècle , DATEADD(year, -YEAR(GETDATE()) % 100, DATEADD(year , DATEDIFF(year, 0, GETDATE()), 0)) AS premier_jour_du_siecle_courant , DATEADD(year, -YEAR(GETDATE()) % 100 + 100, DATEADD(day, -1, DATEADD(year , DATEDIFF(year, 0, GETDATE()), 0))) AS dernier_jour_du_siecle_courant |
J’ai eu un peu la flemme sur le siècle, et j’ai trouvé comme prétexte pour m’arrêter que cela ne doit pas présenter grand intérêt
Bon calculs sur les dates !
ElSüket