Bonjour à tous.
Dans cet article :
Calculs SQL avec des dates : age exact révolu et anniversaires...
je propose deux requêtes (SQL Server, mais faciles à traduire dans les autres dialectes) permettant :
- de calculer l'age exact révolu en année des personnes
- de trouver les personnes dont l'anniversaire tombe entre deux dates données
Age exact révolu en années (fonctions SQL Server) :
La même en pseudo SQL normatif :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 SELECT *, DATEDIFF(YEAR, PRS_DATE_NAISSANCE, GETDATE()) - CASE WHEN MONTH(PRS_DATE_NAISSANCE) < MONTH(GETDATE()) THEN -1 WHEN MONTH(PRS_DATE_NAISSANCE) = MONTH(GETDATE()) AND DAY(PRS_DATE_NAISSANCE) <= DAY(GETDATE()) THEN -1 ELSE 0 END - 1 AS AGE FROM T_PERSONNE_PRS;
Anniversaire entre deux dates (fonctions MS SQL Server) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 SELECT *, EXTRACT(YEAR FROM CURRENT_DATE - PRS_DATE_NAISSANCE) - CASE WHEN EXTRACT(MONTH FROM PRS_DATE_NAISSANCE) < EXTRACT(MONTH FROM CURRENT_DATE) THEN -1 WHEN EXTRACT(MONTH FROM PRS_DATE_NAISSANCE) = EXTRACT(MONTH FROM CURRENT_DATE) AND EXTRACT(DAY FROM PRS_DATE_NAISSANCE) <= EXTRACT(DAY FROM CURRENT_DATE) THEN -1 ELSE 0 END - 1 AS AGE FROM T_PERSONNE_PRS;
-- avec dates du 20 décembre au 10 janvier (an + 1)
La même en SQL normatif :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT * FROM T_PERSONNE_PRS WHERE (MONTH(PRS_DATE_NAISSANCE) * 31 + DAY(PRS_DATE_NAISSANCE) ) % (31 * 12) BETWEEN (MONTH('2014-12-20') * 31 + DAY('2014-12-20')) % (31 * 12) AND (MONTH('2015-01-10') * 31 + DAY('2015-01-10') + 372) % (31 * 12);
Mais je pense qu'il y a peut être des requêtes plus performantes...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT * FROM T_PERSONNE_PRS WHERE MOD((EXTRACT(MONTH FROM PRS_DATE_NAISSANCE) * 31 + EXTRACT(DAY FROM PRS_DATE_NAISSANCE) ) , (31 * 12)) BETWEEN MOD((EXTRACT(MONTH FROM '2014-12-20') * 31 + EXTRACT(DAY FROM '2014-12-20')) , (31 * 12)) AND MOD((EXTRACT(MONTH FROM '2015-01-10') * 31 + EXTRACT(DAY FROM '2015-01-10') + 372) , (31 * 12));
Auriez vous quelques idées de rechange ?
Merci
Partager