Bonjour,
Dans ma BDD, j'ai des personnes avec des dates de naissances. Quel manque d'originalité, je sais ...
Je cherche des personnes dont les noms sont identiques, mais les 2 derniers chiffres de l'année de naissance sont inversés.
Exemple : Jean DUPONT, né le 15/06/1954 et Jean DUPONT, né le 15/06/1945
Jusque là, je gère.
Le problème que j'ai se pose avec les personnes qui sont nées le 29 Février (une année bissextile, donc)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 SELECT * FROM Personnes P1 JOIN Personnes P2 ON P1.UID != P2.UID AND P1.Nom = P2.Nom AND P1.Prénom = P2.Prénom WHERE P1.DDN != '' AND P2.DDN = LEFT(P1.DDN, 2) + REVERSE(SUBSTRING(CAST(P1.DDN as varchar(10)), 3, 2)) + RIGHT (P1.DDN, 6) AND SUBSTRING(CAST(P1.DDN as varchar(10)), 3, 2) != REVERSE(SUBSTRING(CAST(P1.DDN as varchar(10)), 3, 2))
Le soucis, c'est que quand j'inverse les 2 derniers chiffres de l'année de naissance, je peux me retrouver avec une année qui n'est pas bissextile.
Ex : 29/02/1992
select * from Personnes where DDN = '1992/02/29'
Me donne bien des résultats.
Par contre, le programme va inverser l'année, pour donner 29/02/1929. Qui n'est pas vraiment une date valide.
Et SQL m'engueule...
J'ai essayé d'ajouter une clause WHERE qui teste si la date (avec l'année inversée) est bien valide :
Mais il ne passe pas dans la partie ISDATE. Il commence par tester la jointure, et donc, il plante.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 select * from Personnes P1 join Personnes P2 ON P1.UID != P2.UID AND P1.Nom = P2.Nom AND P1.Prénom = P2.Prénom where P1.DDN != '' AND P2.DDN = LEFT(P1.DDN, 2) + REVERSE(SUBSTRING(CAST(P1.DDN as varchar(10)), 3, 2)) + RIGHT (P1.DDN, 6) AND SUBSTRING(CAST(P1.DDN as varchar(10)), 3, 2) != REVERSE(SUBSTRING(CAST(P1.DDN as varchar(10)), 3, 2)) AND ISDATE (LEFT(P1.DDN, 2) + REVERSE(SUBSTRING(CAST(P1.DDN as varchar(10)), 3, 2)) + RIGHT (P1.DDN, 6)) = 1
Avez-vous une idée pour éviter ce problème ?
Merci d'avance
Partager