Comparaison de dates dans une requête SQL, dates égales vues différentes [Résolu]

Signaler
Messages postés
13
Date d'inscription
jeudi 18 décembre 2008
Statut
Membre
Dernière intervention
23 mars 2009
-
Messages postés
13
Date d'inscription
jeudi 18 décembre 2008
Statut
Membre
Dernière intervention
23 mars 2009
-
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

Messages postés
13
Date d'inscription
jeudi 18 décembre 2008
Statut
Membre
Dernière intervention
23 mars 2009

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.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
pourquoi tous ces calculs pour les dates....

le type date existe pourtant.
Messages postés
13
Date d'inscription
jeudi 18 décembre 2008
Statut
Membre
Dernière intervention
23 mars 2009

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.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
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 ^^