Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1576 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  MySQL : requete suivant le mois en cours

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

MySQL : requete suivant le mois en cours

n°1167784
freed102
Arayashiki
Posté le 02-08-2005 à 12:35:30  profilanswer
 

Bonjour,
J'ai enregistré des dates avec un timestamp... et je voudrais extraire les informations en fonction du mois et de l'année...
 
par exemple si je choisi juin2005 il me sort tous les enregistrements du 01 juin au 31 juin 2005...
 
je voulais savoir comment je dois gerer les dates sachant qu'il y a des mois de 28,29,30 et 31 jours... existe-t-il des fonctions php ou mysql qui gère ça tout seul pour faire ma requete qui devrait ressembler à un  
 
"select * from table where date='$date'"
 
j'avais pensé à un truc genre...  
 
"select * from table where date between '$date1' and '$date2'"
 
mais je sais pas comment definir $date1 et $date2... sauf en faisant des mktime(0, 0, 0, 06, 1, 2005) et mktime(0, 0, 0, 06, 31, 2005)
... mais comment faire pour indiquer qu'un mois comporte que 30 jours par exemple sans etre obligé de corriger la requete moi même?


Message édité par freed102 le 02-08-2005 à 12:36:29

---------------
Freed102
mood
Publicité
Posté le 02-08-2005 à 12:35:30  profilanswer
 

n°1167813
freed102
Arayashiki
Posté le 02-08-2005 à 13:20:28  profilanswer
 

bon.. j'ai fait ça :
 

Code :
  1. $_SESSION['selected_month']=$_POST['mois'];
  2. $_SESSION['selected_date1']=mktime(0, 0, 0, $_SESSION['selected_month'], 1, $_POST['year']);
  3. $daysamonth=array("01"=>"31","02"=>"28","03"=>"31","04"=>"30","05"=>"31","06"=>"30","07"=>"31","08"=>"31","09"=>"30","10"=>"31","11"=>"30","12"=>"31" );
  4. foreach($daysamonth as $key=>$value)
  5. {
  6. if($_SESSION['selected_month']==$key)
  7. {
  8. $_SESSION['selected_date2']=mktime(0, 0, 0, $_SESSION['selected_month'], $value, $_POST['year']);
  9. }
  10. }


 
et ça :

Code :
  1. $sql="SELECT * FROM factures WHERE type='facture' and date_reg BETWEEN '$_SESSION[selected_date1]' AND '$_SESSION[selected_date2]' ORDER BY numero_facture DESC";


 
.... ça marche on dirait !  
 
mais les années bisextiles... c mort pour l'instant


Message édité par freed102 le 02-08-2005 à 13:20:41

---------------
Freed102
n°1167815
bl@p_psx
Admin G15-france
Posté le 02-08-2005 à 13:21:05  profilanswer
 

pour mktime,
 
si tu met :
 

Code :
  1. mktime(0,0,0,7,0,2005);


tu retourne le dernier jour du moi de juin ...
 
donc, pour toi, entre  

Code :
  1. $date1 = mktime(0,0,0,6,1,2005);
  2. $date2 = mktime(0,0,0,7,0,2005);


 
@+
 
ps: je t'invite a lire la doc sur la fonction mktime, c'est expliquer dedans. :D
 
ps² extrait de la doc :
 

Citation :

Le dernier jour d'un mois peut être décrit comme le jour "0" du mois suivant, et non pas le jour -1. Les deux exemples suivants vont donner : "Le dernier jour de Fevrier 2000 est: 29". Exemple 2. Dernier jour du mois

Code :
  1. <?php
  2.   $lastday = mktime (0,0,0,3,0,2000);
  3.   echo strftime ("Le dernier jour de Fevrier 2000 est: %d", $lastday);
  4.   $lastday = mktime (0,0,0,4,-31,2000);
  5.   echo strftime ("Le dernier jour de Fevrier 2000 est: %d", $lastday);
  6. ?>



Message édité par bl@p_psx le 02-08-2005 à 13:23:01

---------------
:Moultiplayers:.:Quatuor Chevalier:.:Admin G15-france.com:.:Wiki -G15-france:.:-Papa-:.
n°1167820
afbilou
pouet your life
Posté le 02-08-2005 à 13:25:23  profilanswer
 

Le probleme ne se pose pas vraiment ... pour avoir les données d'un mois fixé tu vas prendre les dates entre le 1er du mois ke tu souhaites et le 1er du mois suivant !
Si tu t'arretes au 30 ou 31 (sans compter fevrier) tu ne prends pas en compte ce dernier jour !
 
Bref tu te complikes la vie pour rien d'autant plus que ta solution est fausse !
 
Ta solution avec between et mktime est la bonne et il faut prendre entre le 1er des deux mois !

n°1167822
mrbebert
Posté le 02-08-2005 à 13:25:51  profilanswer
 

Ce serait pas plus simple d'utiliser les fonctions de MySQL ?
 
SELECT * FROM table WHERE YEAR(date)=YEAR('$date') AND MONTH(date)=MONTH('$date')
 
Quitte à "calculer" le mois et l'année en PHP
SELECT * FROM table WHERE YEAR(date)=2005 AND MONTH(date)=06


Message édité par mrbebert le 02-08-2005 à 13:27:38
n°1167830
freed102
Arayashiki
Posté le 02-08-2005 à 13:44:07  profilanswer
 

bon bah voila avec les années bisextiles ça donnerait ça :
 

Code :
  1. $_SESSION['selected_month']=$_POST['mois'];
  2. $_SESSION['selected_date1']=mktime(0, 0, 0, $_SESSION['selected_month'], 1, $_POST['year']);
  3. $is_bisextile=($_POST['year']-2004)/4;
  4. if(is_float($is_bisextile))
  5. {
  6. $_SESSION['bisextile']="no";
  7. $daysamonth=array("01"=>"31","02"=>"28","03"=>"31","04"=>"30","05"=>"31","06"=>"30","07"=>"31","08"=>"31","09"=>"30","10"=>"31","11"=>"30","12"=>"31" );
  8. }
  9. else
  10. {
  11. $_SESSION['bisextile']="yes";
  12. $daysamonth=array("01"=>"31","02"=>"29","03"=>"31","04"=>"30","05"=>"31","06"=>"30","07"=>"31","08"=>"31","09"=>"30","10"=>"31","11"=>"30","12"=>"31" );
  13. }
  14. foreach($daysamonth as $key=>$value)
  15. {
  16. if($_SESSION['selected_month']==$key)
  17. {
  18. $_SESSION['selected_date2']=mktime(0, 0, 0, $_SESSION['selected_month'], $value, $_POST['year']);
  19. }
  20. }


 
c un peu de la bidouille je trouve.. mais ça marche non ?


---------------
Freed102
n°1167836
bl@p_psx
Admin G15-france
Posté le 02-08-2005 à 13:51:16  profilanswer
 

pourquoi pas simplement :

Code :
  1. $_SESSION['selected_date2'] = mktime(0, 0, 0, $_SESSION['selected_month'] +1, 0, $_POST['year']);


ca fonctionne pareil et c'est 10 lignes de moins.
 
@+


Message édité par bl@p_psx le 02-08-2005 à 13:51:52

---------------
:Moultiplayers:.:Quatuor Chevalier:.:Admin G15-france.com:.:Wiki -G15-france:.:-Papa-:.
n°1167863
rufo
Pas me confondre avec Lycos!
Posté le 02-08-2005 à 14:22:31  profilanswer
 

y'a aussi DATE_FORMAT(Champ, Format) en Mysql qui est bien pratique pour formater les timestamps :)  
Comme format, on peut mettre '%Y-%m-%d' par ex ;)

n°1167868
kalex
Posté le 02-08-2005 à 14:24:48  profilanswer
 

mrbebert a écrit :

Ce serait pas plus simple d'utiliser les fonctions de MySQL ?
 
SELECT * FROM table WHERE YEAR(date)=YEAR('$date') AND MONTH(date)=MONTH('$date')
 
Quitte à "calculer" le mois et l'année en PHP
SELECT * FROM table WHERE YEAR(date)=2005 AND MONTH(date)=06

:jap:  
Mais l'inconvénient, c'est que tu vas scanner toute la table. Un calcul en PHP avec un beetween dans la requête, sera certainement moins lourd.  
 

n°1167920
freed102
Arayashiki
Posté le 02-08-2005 à 15:02:35  profilanswer
 

bl@p_psx a écrit :

pour mktime,
 
si tu met :
 

Code :
  1. mktime(0,0,0,7,0,2005);


tu retourne le dernier jour du moi de juin ...
 
donc, pour toi, entre  

Code :
  1. $date1 = mktime(0,0,0,6,1,2005);
  2. $date2 = mktime(0,0,0,7,0,2005);


 
@+
 
ps: je t'invite a lire la doc sur la fonction mktime, c'est expliquer dedans. :D
 
ps² extrait de la doc :
 

Citation :

Le dernier jour d'un mois peut être décrit comme le jour "0" du mois suivant, et non pas le jour -1. Les deux exemples suivants vont donner : "Le dernier jour de Fevrier 2000 est: 29". Exemple 2. Dernier jour du mois

Code :
  1. <?php
  2.   $lastday = mktime (0,0,0,3,0,2000);
  3.   echo strftime ("Le dernier jour de Fevrier 2000 est: %d", $lastday);
  4.   $lastday = mktime (0,0,0,4,-31,2000);
  5.   echo strftime ("Le dernier jour de Fevrier 2000 est: %d", $lastday);
  6. ?>




effectivement ça pourrait etre plus simple comme ça... j'avais pas vu ce passage


---------------
Freed102
mood
Publicité
Posté le 02-08-2005 à 15:02:35  profilanswer
 

n°1167922
rufo
Pas me confondre avec Lycos!
Posté le 02-08-2005 à 15:02:50  profilanswer
 

kalex a écrit :

:jap:  
Mais l'inconvénient, c'est que tu vas scanner toute la table. Un calcul en PHP avec un beetween dans la requête, sera certainement moins lourd.


 
...between DATE_FORMAT(...) and DATE_FORMAT(...)...

n°1167931
freed102
Arayashiki
Posté le 02-08-2005 à 15:06:03  profilanswer
 

cela me suffit amplement :
 

Code :
  1. if(!empty($_POST['year']))
  2. {
  3. $_SESSION['selected_year']=$_POST['year'];
  4. }
  5. else
  6. {
  7. $_SESSION['selected_year']=date("Y" );
  8. }
  9. $_SESSION['selected_month']=$_POST['mois'];
  10. $_SESSION['selected_date1']=mktime(0, 0, 0, $_SESSION['selected_month'], 1, $_SESSION['selected_year']);
  11. $_SESSION['selected_date2']=mktime(0, 0, 0, $_SESSION['selected_month']+1, 0, $_SESSION['selected_year']);


---------------
Freed102
n°1167937
bl@p_psx
Admin G15-france
Posté le 02-08-2005 à 15:08:13  profilanswer
 

voilà ! là c'est bcp plus simple :D :jap:


---------------
:Moultiplayers:.:Quatuor Chevalier:.:Admin G15-france.com:.:Wiki -G15-france:.:-Papa-:.
n°1167940
freed102
Arayashiki
Posté le 02-08-2005 à 15:09:50  profilanswer
 

... je pense que je vais rester là dessus... les fonctions MYSQL j'ai regardé la doc... mais ça me parle pas bcp... là au moins ça marche... donc c ok !  
 
merci à tous ! :jap:


---------------
Freed102
n°1168105
mrbebert
Posté le 02-08-2005 à 17:04:31  profilanswer
 

kalex a écrit :

:jap:  
Mais l'inconvénient, c'est que tu vas scanner toute la table. Un calcul en PHP avec un beetween dans la requête, sera certainement moins lourd.

En quoi le BETWEEN va permettre de ne pas scanner toute la table :??:

n°1168124
kalex
Posté le 02-08-2005 à 17:18:38  profilanswer
 

mrbebert a écrit :

En quoi le BETWEEN va permettre de ne pas scanner toute la table :??:

C'est pas le BETWEEN qui fait la différence. Par contre, si tu demandes de sortir toutes les dates entre telle date et telle date sous une forme utilisable par MySQL, les index sont utilisables. Par contre si tu utilises une fonction MySQL sur un champ (ici MONTH et YEAR), toute la table doit être traitée pour obtenir une valeur utilisable dans la condition.

n°1168136
mrbebert
Posté le 02-08-2005 à 17:28:20  profilanswer
 

Oui, certes ... en supposant que le champ "date" soit indexé :)

n°1188533
freed102
Arayashiki
Posté le 31-08-2005 à 11:42:40  profilanswer
 

coucou... je remets un sujet sur le tapis... voila.. aujourd'hui on est le 31... mon boss vient d'utiliser mon prog de facturation.. et toutes les factures qui sont crées aujourd'hui sont bien dans la bdd mais n'apparaissent pas !!!
 

Code :
  1. $_SESSION['selected_month']=$_POST['mois'];
  2. $_SESSION['selected_date1']=mktime(0, 0, 0, $_SESSION['selected_month'], 1, $_SESSION['selected_year']);
  3. $_SESSION['selected_date2']=mktime(0, 0, 0, $_SESSION['selected_month']+1, 0, $_SESSION['selected_year']);


 
et en sql :
 

Code :
  1. $sql="SELECT * FROM factures WHERE type='facture' AND date_reg BETWEEN '$_SESSION[selected_date1]' AND '$_SESSION[selected_date2]' ORDER BY numero_facture DESC";


 
quoi qui se passe ?


---------------
Freed102
n°1188547
mrbebert
Posté le 31-08-2005 à 11:53:01  profilanswer
 

Fais un "echo $sql" pour voir à quoi ressemble la requête [:proy]  
(et déterminer si le problème vient des données ou de la construction de la requête en PHP)

n°1188583
freed102
Arayashiki
Posté le 31-08-2005 à 12:50:47  profilanswer
 

bah j'ai changé la date directement dans phpmyadmin en 1125417600 (qui veut dire le 30/08/05 à 18h00) .. et là ma facture reapparait dans la liste du mois d'Aout ! .. donc ya bien un prob avec les dates concernant le dernier jour du mois !


Message édité par freed102 le 31-08-2005 à 12:51:45

---------------
Freed102
n°1188585
freed102
Arayashiki
Posté le 31-08-2005 à 12:55:04  profilanswer
 

voici la syntaxe SQL pour le mois d'Aout:
 

Code :
  1. SELECT * FROM factures WHERE type='facture' AND date_reg BETWEEN '1122847200' AND '1125439200' ORDER BY numero_facture DESC


 
et voici le timestamp du 31/08/05 à 18h00
 
1125504000


Message édité par freed102 le 31-08-2005 à 12:55:58

---------------
Freed102
n°1188587
freed102
Arayashiki
Posté le 31-08-2005 à 13:01:50  profilanswer
 

donc la seule solution que je trouve c'est de tricher.. en ajoutant 86399 secondes au dernier jour du mois....
 

Code :
  1. $_SESSION['selected_month']=$_POST['mois'];
  2. $_SESSION['selected_date1']=mktime(0, 0, 0, $_SESSION['selected_month'], 1, $_SESSION['selected_year']);
  3. $_SESSION['selected_date2']=86399+mktime(0, 0, 0, $_SESSION['selected_month']+1, 0, $_SESSION['selected_year']);


 
la requete SQL deviendra donc :  
 
SELECT * FROM factures WHERE type='facture' AND date_reg BETWEEN '1122847200' AND '1125525599' ORDER BY numero_facture DESC


---------------
Freed102
n°1188589
freed102
Arayashiki
Posté le 31-08-2005 à 13:06:28  profilanswer
 

suis-je bête !!! encore mieux.. sans tricher :

Code :
  1. $_SESSION['selected_month']=$_POST['mois'];
  2. $_SESSION['selected_date1']=mktime(0, 0, 0, $_SESSION['selected_month'], 1, $_SESSION['selected_year']);
  3. $_SESSION['selected_date2']=mktime(23, 59, 59, $_SESSION['selected_month']+1, 0, $_SESSION['selected_year']);


Message édité par freed102 le 31-08-2005 à 13:08:00

---------------
Freed102
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  MySQL : requete suivant le mois en cours

 

Sujets relatifs
requete access c#[DIVERS] - php / mysql - le meilleur joueurs
Le limit en MySQL[MYSQL] Concaténation de plusieurs lignes
[MySQL] Exporter/Dupliquer une bd avec script PHP ?creer un lien qui depend d'une reponse a une requete sql
Débutant – télécharger les cours de bourse sur yahoopb de requête [RESOLU]
Ou trouver un herbergeur gratuit Php Mysql environ 50Mo + 25Mo SQLaccess 2.0 et mysql
Plus de sujets relatifs à : MySQL : requete suivant le mois en cours


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR