Comparaison de dates dans une requête SQL, dates égales vues différentes

Résolu
jdddeschamps Messages postés 13 Date d'inscription jeudi 18 décembre 2008 Statut Membre Dernière intervention 23 mars 2009 - 18 déc. 2008 à 22:55
jdddeschamps Messages postés 13 Date d'inscription jeudi 18 décembre 2008 Statut Membre Dernière intervention 23 mars 2009 - 21 déc. 2008 à 19:22
Bonjour,

Je suis confronté à un petit problème :
Il arrive que deux dates égales soient vues différentes de sorte que je sois obligé de les arrondir à trois secondes près afin qu'un test les rende égales. Exemple de code :
                DateZ = rstZ("GDH")
                VDateZ = DateZ 'VdateZ est de type Variant                VDateZ VDateZ * 28800 '28800 24 h * 60 m * 20 s
                VDateZ = Int(VDateZ) 'j'arrondie la date de l'azimut à 3 secondes près
                'Récupérer l'adopté précédant immédiatement l'heure de détection
                    rstP.MoveLast
'                    DateP = rstP("GDH")
                    Do
                        DateP = rstP("GDH")
                        VDateP = DateP
                        VDateP = VDateP * 28800
                        VDateP = Int(VDateP) 'j'arrondie la date de l'adopté à 3 secondes près
                        rstP.MovePrevious
                    Loop While Not rstP.BOF And VDateP > VDateZ
Ainsi, si DateZ = DateP, je suis sûr que le test VDateP>VDateZ sera faux.
Si je ne fais pas cet arrondi, le test peut être parfois vrai.
Pourquoi ces dates ne sont-elles pas vues égales ? Pourtant, les valeurs de type variant sont égales (par exemple 39301,6711689815 pour les deux variables VdateP et VdateZ avant l'arrondi)
Dans une requête SQL, ça devient compliqué :
ORDER by Date1 asc, Date2 asc
Dans ce cas, tous les enregistrements pour lesquels les Date1 sont égales, sont triés par Date2.
Or il arrive que la requête ne considère pas les Date1 égales alors qu'elles le sont !
Pourquoi ?
N'y a-t-il pas un moyen plus simple que mes arrondis à 3 secondes près laborieux ?

Merci

4 réponses

jdddeschamps Messages postés 13 Date d'inscription jeudi 18 décembre 2008 Statut Membre Dernière intervention 23 mars 2009
21 déc. 2008 à 19:22
La solution pour arrondir la date dans la requête SQL (solution de Renfield) :

Set rst = db.OpenRecordset("SELECT CDate((CLng(`GDH`*40000)*0.000025)) AS `GDHT`,* FROM SoTb ORDER BY 1 ASC, GDHDecision ASC")

.000025 correspond à 2,16 secondes. Arrondi suffisant pour s'affranchir des problèmes de virgule flottante.
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
18 déc. 2008 à 23:26
pourquoi tous ces calculs pour les dates....

le type date existe pourtant.
0
jdddeschamps Messages postés 13 Date d'inscription jeudi 18 décembre 2008 Statut Membre Dernière intervention 23 mars 2009
19 déc. 2008 à 00:12
Parce que quand j'écris :
Loop While Not rstP.BOF And DateP > DateZ
Le test DateP > DateZ peut être vrai même quand les deux dates sont égales !

J'ai trouvé une réponse partielle à ce problème (il s'agit d'un problème de virgule flottante) :
http://support.microsoft.com/kb/194894/fr
Cependant, cela ne résout pas mon problème dans ma requête SQL :
ORDER by Date1 asc, Date2 asc
Comment faire pour que tous les enregistrements dont les Date1 sont égales soient triés selon les Date2 ?
En effet, les problèmes de virgule flottante font que les Dates1 égales ne soient pas toujours vues égales.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
19 déc. 2008 à 05:43
vraiment étrange
tu pourrais me faire parvenir un zip avec tout cela (pas de soucis, je corrige, te renoie et j'efface chez moi, depuis le temps que je fais ce genre d'operations, d'autres peuvent attester de mon serieux et de mon integrité.)

je t'envoi mon mail par mp. a toi de voir si tu me l'envoie ou non ^^
0
Rejoignez-nous