Nous sommes ici sur le forum Langage SQL, je n'utiliserai donc que les fonctions normalisées pour résoudre ton problème.
L'expression la plus simple pour calculer une date d'anniversaire est la suivante :
dobjoueur + INTERVAL (EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(YEAR FROM dobjoueur)) YEAR
Donc pour calculer ton hier-aujourd’hui-demain, il suffirait de se baser sur le résultat de CURRENT_DATE - (dobjoueur + INTERVAL (EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(YEAR FROM dobjoueur)) YEAR).
Malheureusement, lorsqu'on arrive sur le début/fin d'année, le résultat n'est plus cohérent.
Je suis donc arrivé à la requête suivante :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| SELECT anniv + INTERVAL (CASE WHEN reste1 <= 1 THEN 0 WHEN reste2 <= 1 THEN -1 WHEN reste3 <= 1 THEN 1 END) YEAR AS anniversaire
, CASE CURRENT_DATE - (anniv + INTERVAL (CASE WHEN reste1 <= 1 THEN 0 WHEN reste2 <= 1 THEN -1 WHEN reste3 <= 1 THEN 1 END) YEAR)
WHEN +1 THEN 'hier'
WHEN 0 THEN 'aujourd''hui'
WHEN -1 THEN 'demain'
END AS quand
FROM ( SELECT dobjoueur + INTERVAL (EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(YEAR FROM dobjoueur)) YEAR AS anniv
, ABS(CURRENT_DATE - (dobjoueur + INTERVAL (EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(YEAR FROM dobjoueur)) YEAR)) AS reste1
, ABS(CURRENT_DATE - (dobjoueur + INTERVAL (EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(YEAR FROM dobjoueur) - 1) YEAR)) AS reste2
, ABS(CURRENT_DATE - (dobjoueur + INTERVAL (EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(YEAR FROM dobjoueur) + 1) YEAR)) AS reste3
FROM matable
) AS tmp
WHERE reste1 <= 1
OR reste2 <= 1
OR reste3 <= 1 |
Je ne conserve pas dans les résultats les personnes dont l'anniversaire est plus lointain qu'un jour.
PS: A vérifier car je n'ai testé que sur le papier !
Partager