Quantcast
Channel: Le Blog SQL Server d'ElSüket » Utilitaires
Viewing all articles
Browse latest Browse all 87

Trouver le premier et le dernier jour de la semaine, du mois, du trimestre, et autre calculs

$
0
0

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 ;)


Viewing all articles
Browse latest Browse all 87

Trending Articles