OVH Cloud OVH Cloud

pour résumer between , isDate et requête SQL

7 réponses
Avatar
Jean-Marc
Hello,

pour résumer une réponse à 3 posts précédents: comment faire une
requête SQL qui sélectionne les records compris entre 2 dates, les 2
dates étant saisies dans des TextBox. La requête ne se fait que si les
2 dates sont valides. Bref, voici le code commenté:

' ma db est db1.mdb
' une seule table, table1 avec 3 champs:
' id = index primaire numero unique (auto number)
' date = date (type date)
' nom = Text
' les 2 dates saisies le sont dans 2 textbox, Text1 et Text2
'
Private Sub Command1_Click()
Dim db As Database
Dim rs As Recordset
Dim sqlStatement As String
Dim sqlDate1 As String
Dim sqlDate2 As String

Set db = OpenDatabase("c:\db1.mdb")

If IsDate(Text1.Text) And IsDate(Text2.Text) Then
sqlDate1 = "#" & Text1.Text & "#"
sqlDate2 = "#" & Text2.Text & "#"
sqlStatement = "SELECT * from Table1 where date "
sqlStatement = sqlStatement & "Between " & sqlDate1 & " and " &
sqlDate2
Set rs = db.OpenRecordset(sqlStatement)
rs.MoveFirst
While Not rs.EOF
Debug.Print rs.Fields("id"); " "; rs.Fields("nom"); " ";
rs.Fields("date")
rs.MoveNext
Wend
Else
MsgBox "Au moins une des dates est invalide"
End If
End Sub

Espérant que ça aide,

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."

7 réponses

Avatar
dav
merci beaucoup Jean Marc mais une dernière question : et cette histoire
de format de date américain....on le gère comment ?
dans ta requête tu prends la date telle qu'elle est saisie, c'est à dire
au format français...on ne doit pas la convertir au format américain avant ?
précisions : je suis sous access 2000.
merci encore,
dav

Jean-Marc a écrit :

Hello,

pour résumer une réponse à 3 posts précédents: comment faire une
requête SQL qui sélectionne les records compris entre 2 dates, les 2
dates étant saisies dans des TextBox. La requête ne se fait que si les
2 dates sont valides. Bref, voici le code commenté:

' ma db est db1.mdb
' une seule table, table1 avec 3 champs:
' id = index primaire numero unique (auto number)
' date = date (type date)
' nom = Text
' les 2 dates saisies le sont dans 2 textbox, Text1 et Text2
'
Private Sub Command1_Click()
Dim db As Database
Dim rs As Recordset
Dim sqlStatement As String
Dim sqlDate1 As String
Dim sqlDate2 As String

Set db = OpenDatabase("c:db1.mdb")

If IsDate(Text1.Text) And IsDate(Text2.Text) Then
sqlDate1 = "#" & Text1.Text & "#"
sqlDate2 = "#" & Text2.Text & "#"
sqlStatement = "SELECT * from Table1 where date "
sqlStatement = sqlStatement & "Between " & sqlDate1 & " and " &
sqlDate2
Set rs = db.OpenRecordset(sqlStatement)
rs.MoveFirst
While Not rs.EOF
Debug.Print rs.Fields("id"); " "; rs.Fields("nom"); " ";
rs.Fields("date")
rs.MoveNext
Wend
Else
MsgBox "Au moins une des dates est invalide"
End If
End Sub

Espérant que ça aide,



Avatar
Jean-Marc
Ces histoires de formats de date... J'ai testé ce que j'ai écrit avec
une base de données Acess 2000, j'avais saisi quelques enregistrements
pour valider ma solution. J'ai saisi les dates en format français
(JJ/MM/AAAA) dans Access et tout est ok. Si tu as la maîtrise de la
base de données que tu utilises, alors tu n'auras pas de soucis. Les
ennuis commencent avec des DB comme Oracle ou DB2, qui peuvent tourner
sur des systèmes ou le format de date n'est pas (toujours) JJ/MM/AAAA.

En pratique, on peut toujours savoir quel est le format des dates dans
la base, soit en interrogeant la DB elle même (on peut le faire sous
DB2 et Oracle, Access je ne sais pas), soit en faisant un truc plus
rustique mais qui fonctionne très bien: tu inséres un record avec une
date formattée en "JJ/MM/AAAA" ou "JJ/MM/AA", choisie telle que en
format américain, c'est une date invalide. Si ca passe, c'est ok tu es
en format "JJ/MM/AAAA", sinon, ben c'est en américain et tu convertis
alors les dates entrées avant de faire les requêtes de sélection et
d'insert.


Certains recommandent même de stocker les dates comme des chaines de
caractères, c'est à dire de faire du champ date dans la DB un champ de
type string, et les dates par exemple comme ça "30112004". Tu perds
certains avantages liés au type date, mais tu n'as plus à t'en faire
pour ces histoires d'internationalisation. C'est toi qui a choisi et
c'est comme ça. Je n'ai pas d'avis sur la question, ça peut être une
bonne solution. J'ai eu des clients qui exigeaient un tel format pour
les dates, donc ça existe.

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."


"dav" a écrit dans le message de
news:41a0497c$0$8814$
merci beaucoup Jean Marc mais une dernière question : et cette histoire
de format de date américain....on le gère comment ?
dans ta requête tu prends la date telle qu'elle est saisie, c'est à dire
au format français...on ne doit pas la convertir au format américain avant


?
précisions : je suis sous access 2000.
dav

Jean-Marc a écrit :

> Hello,
>
> pour résumer une réponse à 3 posts précédents: comment faire une
> requête SQL qui sélectionne les records compris entre 2 dates, les 2
> dates étant saisies dans des TextBox. La requête ne se fait que si les
> 2 dates sont valides. Bref, voici le code commenté:
>
> ' ma db est db1.mdb
> ' une seule table, table1 avec 3 champs:
> ' id = index primaire numero unique (auto number)
> ' date = date (type date)
> ' nom = Text
> ' les 2 dates saisies le sont dans 2 textbox, Text1 et Text2
> '
> Private Sub Command1_Click()
> Dim db As Database
> Dim rs As Recordset
> Dim sqlStatement As String
> Dim sqlDate1 As String
> Dim sqlDate2 As String
>
> Set db = OpenDatabase("c:db1.mdb")
>
> If IsDate(Text1.Text) And IsDate(Text2.Text) Then
> sqlDate1 = "#" & Text1.Text & "#"
> sqlDate2 = "#" & Text2.Text & "#"
> sqlStatement = "SELECT * from Table1 where date "
> sqlStatement = sqlStatement & "Between " & sqlDate1 & " and " &
> sqlDate2
> Set rs = db.OpenRecordset(sqlStatement)
> rs.MoveFirst
> While Not rs.EOF
> Debug.Print rs.Fields("id"); " "; rs.Fields("nom"); " ";
> rs.Fields("date")
> rs.MoveNext
> Wend
> Else
> MsgBox "Au moins une des dates est invalide"
> End If
> End Sub
>
> Espérant que ça aide,
>


Avatar
Your name
Bonjour Jean-Marc,

J'ai toutefois un doute sur l'inutilité de convertir les dates au format
US. SQL ne gère que le format US et donc je ne suis pas sûr, dés lors que
les dates saisies dans des TextBox sont bien des dates, que les tuples
renvoyés par la requête soient les bons.

Ainsi, avec ta procédure, très bien par ailleurs, un petit test sur la
période allant du 01/11/03(Text1) au 11/12/03(Text2) sur une table de
factures me retourne tous les tuples du 11/01/03 au 12/11/03 (les dates
sont au format FR dans Access2K-DAO comme Dav) alors que je voulais
obtenir la période allant du 1er nov au 12 déc. Donc, il me parait
impératif de convertir au format US les dates saisies dans les TextBox
pour obtenir les tuples requis.

Me tromperai-je ?

A+
Eric

"Jean-Marc" écrivait news:41a05940$0$25055
$:


Ces histoires de formats de date... J'ai testé ce que j'ai écrit


avec
une base de données Acess 2000, j'avais saisi quelques


enregistrements
pour valider ma solution. J'ai saisi les dates en format


français
(JJ/MM/AAAA) dans Access et tout est ok. Si tu as la maîtrise de


la
base de données que tu utilises, alors tu n'auras pas de soucis.


Les
ennuis commencent avec des DB comme Oracle ou DB2, qui peuvent


tourner
sur des systèmes ou le format de date n'est pas (toujours)


JJ/MM/AAAA.

En pratique, on peut toujours savoir quel est le format des dates


dans
la base, soit en interrogeant la DB elle même (on peut le faire


sous
DB2 et Oracle, Access je ne sais pas), soit en faisant un truc


plus
rustique mais qui fonctionne très bien: tu inséres un record avec


une
date formattée en "JJ/MM/AAAA" ou "JJ/MM/AA", choisie telle que


en
format américain, c'est une date invalide. Si ca passe, c'est ok tu


es
en format "JJ/MM/AAAA", sinon, ben c'est en américain et tu


convertis
alors les dates entrées avant de faire les requêtes de sélection


et
d'insert.


Certains recommandent même de stocker les dates comme des chaines


de
caractères, c'est à dire de faire du champ date dans la DB un champ


de
type string, et les dates par exemple comme ça "30112004". Tu


perds
certains avantages liés au type date, mais tu n'as plus à t'en


faire
pour ces histoires d'internationalisation. C'est toi qui a choisi


et
c'est comme ça. Je n'ai pas d'avis sur la question, ça peut être


une
bonne solution. J'ai eu des clients qui exigeaient un tel format


pour
les dates, donc ça existe.



Avatar
Jean-Marc
"Your name" a écrit dans le message de
news:
Bonjour Jean-Marc,

J'ai toutefois un doute sur l'inutilité de convertir les dates au format
US. SQL ne gère que le format US et donc je ne suis pas sûr, dés lors que
les dates saisies dans des TextBox sont bien des dates, que les tuples
renvoyés par la requête soient les bons.

Ainsi, avec ta procédure, très bien par ailleurs, un petit test sur la
période allant du 01/11/03(Text1) au 11/12/03(Text2) sur une table de
factures me retourne tous les tuples du 11/01/03 au 12/11/03 (les dates
sont au format FR dans Access2K-DAO comme Dav) alors que je voulais
obtenir la période allant du 1er nov au 12 déc. Donc, il me parait
impératif de convertir au format US les dates saisies dans les TextBox
pour obtenir les tuples requis.

Me tromperai-je ?



Hello,

Voici ma table dans Access2000

id date nom
1 11/10/2004 non
2 30/11/2004 oui
3 5/12/2004 oui
4 6/12/2004 oui
5 16/12/2004 non
6 10/11/2004 non
7 14/11/2004 non

Les valeurs de mes 2 TextBox:
15/11/2004 et 15/12/2004

Le retour de VB:
2 oui 30/11/2004
3 oui 5/12/2004
4 oui 6/12/2004

Ca me semble correct, non ?

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
Avatar
Jean-Marc
"Jean-Marc" a écrit dans le message de
news:41a0f65f$0$25067$
"Your name" a écrit dans le message de
news:
> Bonjour Jean-Marc,
>
> J'ai toutefois un doute sur l'inutilité de convertir les dates au format
> US. SQL ne gère que le format US et donc je ne suis pas sûr, dés lors


que
> les dates saisies dans des TextBox sont bien des dates, que les tuples
> renvoyés par la requête soient les bons.
>
> Ainsi, avec ta procédure, très bien par ailleurs, un petit test sur la
> période allant du 01/11/03(Text1) au 11/12/03(Text2) sur une table de
> factures me retourne tous les tuples du 11/01/03 au 12/11/03 (les dates
> sont au format FR dans Access2K-DAO comme Dav) alors que je voulais
> obtenir la période allant du 1er nov au 12 déc. Donc, il me parait
> impératif de convertir au format US les dates saisies dans les TextBox
> pour obtenir les tuples requis.
>
> Me tromperai-je ?





J'ai rien dit, tu as raison. Access m'a joué un tour.
Il faut convertir en format US dans ce cas, ou plus exactement en
"MM/JJ/AAAA".

Tu avais tout à fait raison, merci de l'avoir signalé.

Amicalement,
--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
Avatar
Eric
Re Jean-Marc,

J'allais patcher ma version de VB6 car j'ai que le SP5. Mais si
apparemment, tu as constaté les mêmes résultats que moi, alors je saute SP6
car je ne suis pas sûr de ne pas avoir plus de désagrément.

arf, les dates , c'est infernal.

Du coup, à vouloir franciser tout, on s'emmèle les pinceaux. Notamment dans
Access où sous le concepteur de requête, il faut inscrire au format Fr et
en SQL en format US. Quid de l'homogénéité ? Et que dire sur la suite
Office où les fonctions sont, suivant le cas, accentuées ou non (Ex:Année()
pour Access et Annee() pour Excel)

J'en viens à regretter le bon temps du tout english

A nous de jongler ...

Amicalement
Eric


"Jean-Marc" écrivait
news:41a0f91c$0$25062$:


J'ai rien dit, tu as raison. Access m'a joué un tour.
Il faut convertir en format US dans ce cas, ou plus exactement en
"MM/JJ/AAAA".

Tu avais tout à fait raison, merci de l'avoir signalé.

Amicalement,


Avatar
Jean-Marc
"Eric" a écrit dans le message de
news:
Re Jean-Marc,

J'allais patcher ma version de VB6 car j'ai que le SP5. Mais si
apparemment, tu as constaté les mêmes résultats que moi, alors je saute


SP6
car je ne suis pas sûr de ne pas avoir plus de désagrément.

arf, les dates , c'est infernal.

Du coup, à vouloir franciser tout, on s'emmèle les pinceaux. Notamment


dans
Access où sous le concepteur de requête, il faut inscrire au format Fr et
en SQL en format US. Quid de l'homogénéité ? Et que dire sur la suite
Office où les fonctions sont, suivant le cas, accentuées ou non


(Ex:Année()
pour Access et Annee() pour Excel)

J'en viens à regretter le bon temps du tout english

A nous de jongler ...





Je confirme, il faut s'y faire, tout en US reste surement la meilleure
solution... Du coup, attention a IsDate, car les 2 chaines suivantes
retournent TRUE:

"31/12/2004" => IsDate = TRUE
"12/31/2004" => IsDate = TRUE !!!

A ce propos, ils ne se mouillent pas des masses dans la documentation:
"IsDate returns True if the expression is a date or is recognizable as a
valid date" ...

Donc, il faut:
- afficher un message à l'utilisateur lui précisant de rentrer sa date
au format JJ/MM/AAAA
- Vérifier par IsDate
- Ajouter en plus un test de cohérence: JJ entre 01 et 31 et MM entre
01 et 12
- puis arbitrairement inverser dans la chaine JJ et MM (remettre en
format US)
- construire le SQL

Finalement, mon petit exemple devient:

-----------------------------------------------------------------------

' ma db est db1.mdb
' une seule table, table1 avec 3 champs:
' id = index primaire numero unique (auto number)
' date = date (type date)
' nom = Text
'
Private Sub Command1_Click()
Dim db As Database
Dim rs As Recordset
Dim sqlStatement As String
Dim sqlDate1 As String
Dim sqlDate2 As String
Dim usDate As String

Set db = OpenDatabase("c:db1.mdb")

If IsProbableEuropeanFormattedDate(Text1.Text) And
IsProbableEuropeanFormattedDate(Text2.Text) Then
usDate = convertEUDateToUSDate(Text1.Text)
sqlDate1 = "#" & usDate & "#"
usDate = convertEUDateToUSDate(Text2.Text)
sqlDate2 = "#" & usDate & "#"
sqlStatement = "SELECT * from Table1 where date "
sqlStatement = sqlStatement & "Between " & sqlDate1 & " and " &
sqlDate2
Set rs = db.OpenRecordset(sqlStatement)
If rs.RecordCount = 0 Then
Debug.Print "Aucun enregistrement."
Else
rs.MoveFirst
While Not rs.EOF
Debug.Print rs.Fields("id"); " "; rs.Fields("nom"); " ";
rs.Fields("date")
rs.MoveNext
Wend
End If
Else
MsgBox "Au moins une des dates est invalide"
End If

End Sub
'
' Verifie qu'une chaine de la forme "JJ/MM/AA" ou "JJ/MM/AAAA" est
' eventuellement une date valide.
'
Function IsProbableEuropeanFormattedDate(s As String) As Boolean
Dim jj As Integer
Dim mm As Integer

If IsDate(s) And (Len(s) = 10 Or Len(s) = 8) Then
If Mid$(s, 3, 1) = "/" And Mid$(s, 6, 1) = "/" Then
jj = Val(Mid$(s, 1, 2))
mm = Val(Mid$(s, 4, 2))
If (jj > 0) And (jj < 32) And (mm > 0) And (mm < 13) Then
IsProbableEuropeanFormattedDate = True
End If
End If
End If
End Function
'
' Assume sans controle que s est de la forme "JJ/MM/AA" ou "JJ/MM/AAAA" et
transforme
' en "MM/JJ/AA" ou "MM/JJ/AAAA"
'
Public Function convertEUDateToUSDate(s As String) As String
convertEUDateToUSDate = Mid$(s, 4, 2) & "/" & Mid$(s, 1, 2) & "/" &
Mid$(s, 7)
End Function


--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."