Interrogation SQL avec une période de dates

Interrogation SQL avec une période de dates - PHP - Programmation

Marsh Posté le 14-01-2012 à 18:31:24    

Bonjour et Bonne et heureuse année à toutes et à tous,
 
voila j'ai besoin d'un peu d'aide.
 
J'ai une base de donnée dans laquelle il y à:
 
- un champ debut au format date,
- un champ fin au format date, (YYYY-mm-dd)
- un champ periode au format varchar.
- un champ id
 
 j'interroge cette base avec ceci:
 
$date = date("Y-m-d" );
   
 
  mysql_select_db($database_dbprotect, $bdd);
 
  $query_users = "SELECT * FROM periodes WHERE (debut <= $date) AND (fin >= $date) ";  
 
  $users = mysql_query($query_users, $bdd) or die(mysql_error());
         while ( $row_users = mysql_fetch_assoc($users)) {
 
   $session = $row_users['periode'];
   }  
 
mais je n'arrive pas à afficher l'enregistrement qui correspont à:
 
compris entre debut, aujourd'hui, fin
 
un peu d'aide SVP!!!
merci par avance.....

Reply

Marsh Posté le 14-01-2012 à 18:31:24   

Reply

Marsh Posté le 17-01-2012 à 16:16:38    

Coucou,
 
Si je comprendre bien, dans ta requête, tu demande les enregistrements dont le debut = aujourd'hui et la fin = aujourd'hui.
En effet, tu déclare la variable $date = date("Y-m-d" ); Cette fonction t’écris la date au format 2012-01-18. Ça correspond bien au format de la base de donnée.
 
Cependant, je pense qu'il ne peu y avoir de période (dans ton concept) ou le début, la fin et aujourd'hui ai la même valeurs. Au pire des cas, il pourrait y avoir plusieurs possibilité.
 
Je ne vois pas de Mysql_fetch_array(); dans ton code. Est-ce normal. Même si le résultat est unique, il y a plusieurs champs (SELECT *) donc le résultat est sous forme de tableau
 
Autre chose, j'ai testé une requete pour savoir si les opérateurs <= et >= fonctionnait avec les dates. J'avais 3 dates: 2012-01-18, 2012-01-19 et 2012-01-20, lorsque je demandais > à 2012-01-18, j'avais les trois champs qui s'affichait. Je ne pense pas que l'on puisse utiliser les opérateurs logique avec les dates.
 
Pour pallier à celà, tu peut utiliser le BETWEEN ou IN.
 
Avant d'aller je vais attendre ta réponse concernant le fait que début, ajdh et fin aient la même valeur.
De plus j'aimerais comprendre plus largement le fonctionnement de ton script. A l'insertion de l'enregistrement, quel sont les données enregistré. J'imagine que le début est renseigné avec la date : YYYY-MM-JJ, le champ fin n'est pas remplis.  
 
Moi j'ai un programme ou j'enregistre toutes les connexions des sessions utilisateur en base de donnée via un script à l'ouverture de session.
L'enregistrement s'effectue ainsi: (c'est une requête mysql en bat faisant appel à l'application mysql.exe qu préalablement mise dans le system32)
 

Code :
  1. mysql -h 192.168.0.11 -u ***n -p*** -e "use logregistry; INSERT INTO logregistry VALUES('NULL','%USERNAME%','%COMPUTERNAME%','%ip%','%DATE% - %TIME%', 'N/A')"


 
Pour la fermeture de session on à ceci:
 

Code :
  1. mysql -h 192.168.0.11 -u *** -p*** -e "use logregistry; SET @ID = (SELECT MAX(ID) FROM Logregistry WHERE Username='%USERNAME%' AND Computername ='%COMPUTERNAME%' AND Logoff='N/A'); UPDATE logregistry SET Logoff='%DATE% - %TIME%' WHERE ID=@ID;


 
Il met à jour l'information de l'utilisateur à l'aide de son nom d'utilisateur et à l'aide de 'N/A' qui veut dire chez moi que la session est toujours active. Il peut y avoir plusieurs 'N/A' pour un utilisateur, mais dans la majorité des cas, les utilisateur n'ouvrent pas plusieurs sessions en même temps. Si jamais la session à buggé, l'utilisateur quand il se connecte plus tard, créer un nouvelle enregistrement et mettra à jour la dernière entrée. Ainsi j'ai également un visuelle sur les bugs de session.
 
j'attend des nouvelles. Hésite pas à me MP, voir même m'envoyer des mails ici: neo-blaster@hotmail.fr afin de mieu cerné le problème !!
 

Reply

Marsh Posté le 22-01-2012 à 15:00:52    

si on peut utiliser les opérateurs logiques avec les dates à condition de les quoter.
 
Soit:
 
  $query_users = "SELECT * FROM periodes WHERE (debut <= '$date') AND (fin >=' $date') ";  


---------------
Aimer les femmes intelligentes est un plaisir de pédéraste. (Charles Baudelaire) - Vous vulgarisez :o (Jean-Kevin Dubois)
Reply

Marsh Posté le 23-01-2012 à 14:40:12    

Ouai enfin si on exploite au mieux le SQL c'est plutôt ça :

Code :
  1. select
  2.     *
  3. from
  4.     TABLE
  5. where
  6.     CHAMPS_DATE not between :date_debut and :date_fin
  7. ;


Message édité par MEI le 23-01-2012 à 14:41:12

---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 23-01-2012 à 16:07:01    

pourquoi 'not' ? Y a t il une différence de performance entre les 2?

 

EDIT: non aucune http://stackoverflow.com/questions [...] mance-over

Message cité 1 fois
Message édité par philippe06 le 23-01-2012 à 16:08:25

---------------
Aimer les femmes intelligentes est un plaisir de pédéraste. (Charles Baudelaire) - Vous vulgarisez :o (Jean-Kevin Dubois)
Reply

Marsh Posté le 23-01-2012 à 16:59:29    

philippe06 a écrit :

pourquoi 'not' ? Y a t il une différence de performance entre les 2?
 
EDIT: non aucune http://stackoverflow.com/questions [...] mance-over


Parce qu'il veux ce qui est avant la date1 et après la date2, donc ce qui n'est pas entre date1 et date2. ;)
 
Pour les performances, de manière général (pas que sur le between), ça dépendra toujours des SGBD, mais pour Oracle, que j'utilise tout les jours, il va de toutes façons réécrire ta requête avant de la passé à l’optimiser, et par exemple, between ou in son réécrit avec des clauses where.
 
Le but est d'avant tout faire une requête lisible et compréhensible par les autres développeurs.

Message cité 1 fois
Message édité par MEI le 23-01-2012 à 17:00:30

---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 23-01-2012 à 17:08:37    

MEI a écrit :


Parce qu'il veux ce qui est avant la date1 et après la date2, donc ce qui n'est pas entre date1 et date2. ;)


J'ai compris l'inverse d'après   $query_users = "SELECT * FROM periodes WHERE (debut <= $date) AND (fin >= $date) ";  

MEI a écrit :


Pour les performances, de manière général (pas que sur le between), ça dépendra toujours des SGBD, mais pour Oracle, que j'utilise tout les jours, il va de toutes façons réécrire ta requête avant de la passé à l’optimiser, et par exemple, between ou in son réécrit avec des clauses where.


Comme MySQL qu'utilise l'auteur du thread, c'est un sucre syntaxique.

MEI a écrit :


Le but est d'avant tout faire une requête lisible et compréhensible par les autres développeurs.


 
Tout à fait. Personnellement je comprends mieux des <= et >= que des BETWEEN, les BETWEEN ca me fait penser à du cobol  [:milfnduck lover:3]  


---------------
Aimer les femmes intelligentes est un plaisir de pédéraste. (Charles Baudelaire) - Vous vulgarisez :o (Jean-Kevin Dubois)
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed