MySQL : requete suivant le mois en cours

MySQL : requete suivant le mois en cours - PHP - Programmation

Marsh Posté le 02-08-2005 à 12:35:30    

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
Reply

Marsh Posté le 02-08-2005 à 12:35:30   

Reply

Marsh Posté le 02-08-2005 à 13:20:28    

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
Reply

Marsh Posté le 02-08-2005 à 13:21:05    

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-:.
Reply

Marsh Posté le 02-08-2005 à 13:25:23    

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 !

Reply

Marsh Posté le 02-08-2005 à 13:25:51    

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
Reply

Marsh Posté le 02-08-2005 à 13:44:07    

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
Reply

Marsh Posté le 02-08-2005 à 13:51:16    

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-:.
Reply

Marsh Posté le 02-08-2005 à 14:22:31    

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 ;)

Reply

Marsh Posté le 02-08-2005 à 14:24:48    

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.  
 

Reply

Marsh Posté le 02-08-2005 à 15:02:35    

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
Reply

Marsh Posté le 02-08-2005 à 15:02:35   

Reply

Marsh Posté le 02-08-2005 à 15:02:50    

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(...)...

Reply

Marsh Posté le 02-08-2005 à 15:06:03    

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
Reply

Marsh Posté le 02-08-2005 à 15:08:13    

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


---------------
:Moultiplayers:.:Quatuor Chevalier:.:Admin G15-france.com:.:Wiki -G15-france:.:-Papa-:.
Reply

Marsh Posté le 02-08-2005 à 15:09:50    

... 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
Reply

Marsh Posté le 02-08-2005 à 17:04:31    

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 :??:

Reply

Marsh Posté le 02-08-2005 à 17:18:38    

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.

Reply

Marsh Posté le 02-08-2005 à 17:28:20    

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

Reply

Marsh Posté le 31-08-2005 à 11:42:40    

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
Reply

Marsh Posté le 31-08-2005 à 11:53:01    

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)

Reply

Marsh Posté le 31-08-2005 à 12:50:47    

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
Reply

Marsh Posté le 31-08-2005 à 12:55:04    

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
Reply

Marsh Posté le 31-08-2005 à 13:01:50    

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
Reply

Marsh Posté le 31-08-2005 à 13:06:28    

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
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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