Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/01/2012, 15h35   #1
Invité régulier
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Vienne (Poitou Charente)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2012
Messages : 22
Points : 7
Points : 7
Par défaut SQL, Problème avec Between

Bonjour à tous,

Je suis actuellement en train de faire une appli où l'on saisit des enregistrements dans des périodes.
J'ai une vérification en SQL qui se fait avec un between :
Code :
1
2
3
4
5
6
 
SELECT *
FROM saisie
WHERE `ID_ETABLISSEMENT` =1
AND (('2012-01-24' BETWEEN `DATE_DEBUT` AND `DATE_FIN`)
OR ('2012-01-25' BETWEEN `DATE_DEBUT` AND `DATE_FIN'))
J'ai cherché partout, mais je n'ai pas trouvé pour que ça fasse comme si
Code :
`DATE_DEBUT`<'2012-01-24'<`DATE_FIN`
et pas
Code :
`DATE_DEBUT`<='2012-01-24'<=`DATE_FIN`
Est-ce que quelqu'un pourrait m'aider ??

Merci d'avance pour vos réponse
Heallidan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 15h46   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 668
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 668
Points : 2 676
Points : 2 676
Bonjour,

Utilisez un AND à la place du between ?
punkoff est actuellement connecté   Envoyer un message privé Réponse avec citation 20
Vieux 16/01/2012, 15h49   #3
Membre Expert
 
Avatar de lola06
 
Femme Laure
Consultante en Business Intelligence
Inscription : avril 2007
Messages : 984
Détails du profil
Informations personnelles :
Nom : Femme Laure
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Consultante en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2007
Messages : 984
Points : 1 699
Points : 1 699
Bonjour,

Tu peux faire une équivalence,

Code :
 DATE_DEBUT < '2012-01-24' < DATE_FIN
est équivalent à

Code :
DATE_DEBUT + 1 jour <= '2012-01-24' <= DATE_FIN - 1 jour

OU utiliser un AND

Code :
1
2
 DATE_DEBUT < '2012-01-24' 
AND  '2012-01-24' < DATE_FIN
P.S : Pense à indiquer ton SGBD !!
__________________
~ Lola ~

Ne pas oublier :
et aussi :
lola06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 16h57   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
Citation:
P.S : Pense à indiquer ton SGBD !!
Vu la présence de ces saloperies d'apostrophes inversées dans la requête, je parierais pour MySQL !

Quand on veut exclure les bornes de la période, le plus simple est effectivement d'utiliser un DATE_DEBUT < 'la date basse' AND DATE_FIN > 'la date haute'
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 20
Vieux 16/01/2012, 17h07   #5
Invité régulier
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Vienne (Poitou Charente)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2012
Messages : 22
Points : 7
Points : 7
Merci à tous pour vos réponses très rapides, j'ai résolue le problème en faisant
Code :
DATE_DEBUT + 1 jour <= '2012-01-24' <= DATE_FIN - 1 jour
lors de l'affectation des date avec mon appli.
Citation:
Vu la présence de ces saloperies d'apostrophes inversées dans la requête, je parierais pour MySQL !
Je confirme, c'est bien du MySQL
Heallidan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 17h15   #6
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 668
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 668
Points : 2 676
Points : 2 676
Ca marche ca sous MySql ??

Bref, sinon je vote pour la dernière solution de lola06 et celle de Cinephil.

Faire des opérations sur des colonnes dans une clause where ca n'est jamais bon. (pas d'utilisation d'index, incohérence au niveau des stats, etc)
punkoff est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 17h28   #7
Invité régulier
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Vienne (Poitou Charente)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2012
Messages : 22
Points : 7
Points : 7
Citation:
Envoyé par punkoff Voir le message
Ça marche ça sous MySql ??

Bref, sinon je vote pour la dernière solution de lola06 et celle de Cinephil.

Faire des opérations sur des colonnes dans une clause where ca n'est jamais bon. (pas d'utilisation d'index, incohérence au niveau des stats, etc)
Je ne l'ai pas fait sous MySql, mais c'est dans mon Lazarus que j'utilise des paramètres, ainsi pour ma requête j'ai :
Code :
1
2
3
4
5
SELECT *
FROM saisie
WHERE `ID_ETABLISSEMENT` =:p_id
AND ((:p_dated BETWEEN :p_datedebut AND :p_datefin )
OR (:p_datef BETWEEN :p_datedebut AND :p_datefin ))
Les :p_date sont des paramètres auquel je place mes variables. Donc :p_datedebut et :p_datefin reçoivent mes dates calculées à chaque exécution de la requête
Heallidan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 18h05   #8
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
Citation:
Envoyé par Heallidan Voir le message
Merci à tous pour vos réponses très rapides, j'ai résolue le problème en faisant
Code :
DATE_DEBUT + 1 jour <= '2012-01-24' <= DATE_FIN - 1 jour
lors de l'affectation des date avec mon appli.

Je confirme, c'est bien du MySQL
Attention La "solution" trouvée est complètement fausse car mysql évalue cette expression en deux fois, d'abord, en remplaçant la 1ere inégalité par un 1 ou un 0 suivant qu'elle est vraie ou fausse, puis en comparant 1 ou 0 à DATE_FIN-1, ce qui n'a pas de sens vu que les types sont différents, mais ça ne l'empêche pas de sortir un résultat.
Exemple:
Code :
1
2
3
4
5
6
7
8
 
mysql> SELECT '2011-01-01' <= '2012-01-01' <= '2009-01-01' AS resultat;
+----------+
| resultat |
+----------+
|        1 |
+----------+
1 row IN SET, 1 warning (0.00 sec)
A noter qu'il y a un warning. En faisant show warnings, on obtient:
Code :
1
2
3
4
5
6
7
8
 
mysql> SHOW warnings;
+---------+------+------------------------------------------------+
| Level   | Code | Message                                        |
+---------+------+------------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: '2009-01-01' |
+---------+------+------------------------------------------------+
1 row IN SET (0.00 sec)
estofilo est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2012, 10h35   #9
Invité régulier
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Vienne (Poitou Charente)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2012
Messages : 22
Points : 7
Points : 7
Très bien, merci a vous, j'ai opté pour la solution
Code :
DATE_DEBUT < 'la date basse' AND DATE_FIN > 'la date haute'
Ça fonctionne bien comme ça et mon code est plus propre.
Heallidan est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h18.


 
 
 
 
Partenaires

Hébergement Web