Date et optimisation...

Date et optimisation... - SQL/NoSQL - Programmation

Marsh Posté le 13-07-2006 à 09:29:34    

Bonjour à tous,
 
Je travail actuellement sur un projet J2EE avec une base MySQL.
Dans cette base j'ai une table appelée CLOTURE_RESSOURCE qui contient deux champs :

  • Un champ ID_RESSOURCE VARCHAR(10)
  • Un champ DATE_CLOTURE DATE


Le but de cette table est de savoir qu'elles sont les ressources qui sont cloturées pour une date donnée sachant que les clotures sont mensuelles. La table CLOTURE_RESSOURCE contiendra par exemple l'enregistrement :

  • 1234567890
  • 2006-05-01


Ce qui signifie que la ressource 1234567890 a été cloturée pour le mois de mai 2006.
Maintenant il faut que pour une date donnée, je vérifie qu'une ressource est cloturée ou pas. Pour une date unique, rien de bien compliqué, il suffit de récupérer l'année et le mois et d'aller rechercher dans la table.
 
Par contre, il faut que je vérifie maintenant pour chaque jour d'une semaine, sachant qu'une semaine peut se chevaucher sur 2 mois. Auparavant je faisais une boucle en Java qui m'incrémenter mes jours de la semaine et pour chacune j'effectuais une requête. Mais pour chaque semaine j'effectuais donc 5 requétes (du lundi au vendredi). J'aurai voulu savoir comment je pouvais procéder autrement en utilisant les divers fonctions de date telles que DATE_ADD,...
 
Merci d'avance de vos réponses...

Reply

Marsh Posté le 13-07-2006 à 09:29:34   

Reply

Marsh Posté le 13-07-2006 à 09:31:16    

En utilisant un timestamp?

Reply

Marsh Posté le 13-07-2006 à 09:34:04    

C'est à dire, tu peux développer s'il te plaît ?

Reply

Marsh Posté le 13-07-2006 à 09:36:16    

Voici ma boucle principale :

Code :
  1. for(int i = 0 ; i < 5 ; i++) {
  2. String dteDateCloture = DateUtils.getFirstDayOfMonth(gc);
  3. // Verifier si l'activite n'a pas ete cloture pour ce mois
  4. rs2 = QuerySuiviActivite.selectionnerCloture(ds, id_ress, dteDateCloture);
  5. // Si le contrat n'a pas été cloturé et que la date courante est valide
  6. if(! rs2.next() && DateUtils.isBetween(dDebut, dFin, gc)) {
  7.  joursValides[i] = true;
  8. }
  9. // On passe au jour suivant    
  10. gc.add(Calendar.DAY_OF_YEAR, 1);
  11. }


En partant du principe qu'au début, gc contient le premier jour de la semaine (le lundi)...

Reply

Marsh Posté le 13-07-2006 à 09:37:59    

un timestamp, c'est une valeur numérique (un entier) qui indique le temps écoulé en secondes depuis le 1er janvier 1970 (début du temps UNIX). C'est donc beaucoup plus simple à manipuler que des dates.

Reply

Marsh Posté le 13-07-2006 à 09:47:00    

Moi j'avais tester un truc de ce genre (c'est pas trés beau, c'est sûr mais au moins je ne vais utiliser qu'une seule connexion à la BDD). Mais ça ne fonctionne pas lorsqu'il y a aucun enregistrement dans la table CLOTURE_RESSOURCE...

Code :
  1. SELECT
  2.   (SELECT (COUNT(ID_RESSOURCE) > 0)
  3.     FROM cra_dev.CLOTURE_RESSOURCE
  4.     WHERE ID_RESSOURCE='11111111'
  5.     AND MONTH(DATE_CLOTURE)=MONTH(DATE_ADD('2006-08-28', INTERVAL 0 DAY))
  6.     AND YEAR(DATE_CLOTURE)=YEAR(DATE_ADD('2006-08-28', INTERVAL 0 DAY))
  7.   ) as CLO_JOUR1,
  8.   (SELECT (COUNT(ID_RESSOURCE) > 0)
  9.     FROM cra_dev.CLOTURE_RESSOURCE
  10.     WHERE ID_RESSOURCE='11111111'
  11.     AND MONTH(DATE_CLOTURE)=MONTH(DATE_ADD('2006-08-28', INTERVAL 1 DAY))
  12.     AND YEAR(DATE_CLOTURE)=YEAR(DATE_ADD('2006-08-28', INTERVAL 1 DAY))
  13.   ) as CLO_JOUR2,
  14.   (SELECT (COUNT(ID_RESSOURCE) > 0)
  15.     FROM cra_dev.CLOTURE_RESSOURCE
  16.     WHERE ID_RESSOURCE='11111111'
  17.     AND MONTH(DATE_CLOTURE)=MONTH(DATE_ADD('2006-08-28', INTERVAL 2 DAY))
  18.     AND YEAR(DATE_CLOTURE)=YEAR(DATE_ADD('2006-08-28', INTERVAL 2 DAY))
  19.   ) as CLO_JOUR3,
  20.   (SELECT (COUNT(ID_RESSOURCE) > 0)
  21.     FROM cra_dev.CLOTURE_RESSOURCE
  22.     WHERE ID_RESSOURCE='11111111'
  23.     AND MONTH(DATE_CLOTURE)=MONTH(DATE_ADD('2006-08-28', INTERVAL 3 DAY))
  24.     AND YEAR(DATE_CLOTURE)=YEAR(DATE_ADD('2006-08-28', INTERVAL 3 DAY))
  25.   ) as CLO_JOUR4,
  26.   (SELECT (COUNT(ID_RESSOURCE) > 0)
  27.     FROM cra_dev.CLOTURE_RESSOURCE
  28.     WHERE ID_RESSOURCE='11111111'
  29.     AND MONTH(DATE_CLOTURE)=MONTH(DATE_ADD('2006-08-28', INTERVAL 4 DAY))
  30.     AND YEAR(DATE_CLOTURE)=YEAR(DATE_ADD('2006-08-28', INTERVAL 4 DAY))
  31.   ) as CLO_JOUR5
  32. FROM
  33.   cra_dev.CLOTURE_RESSOURCE


Message édité par brasseld le 13-07-2006 à 09:50:23
Reply

Marsh Posté le 17-07-2006 à 10:38:55    

mon dieu :sweat:
 

select count(*), ladate
from latable
where ladate between :date1 and :date2
group by ladate


 
c'est quand même un peu plus propre non ?
 
avec date1 et date2 deux paramètres au format TIMESTAMP correspondant au début et à la fin de la semaine.


Message édité par Arjuna le 17-07-2006 à 10:40:07
Reply

Sujets relatifs:

Leave a Replay

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