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

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Date et optimisation...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Date et optimisation...

n°1406121
brasseld
Posté le 13-07-2006 à 09:29:34  profilanswer
 

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

mood
Publicité
Posté le 13-07-2006 à 09:29:34  profilanswer
 

n°1406124
soulmanto
Chat Noir replica
Posté le 13-07-2006 à 09:31:16  profilanswer
 

En utilisant un timestamp?

n°1406127
brasseld
Posté le 13-07-2006 à 09:34:04  profilanswer
 

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

n°1406129
brasseld
Posté le 13-07-2006 à 09:36:16  profilanswer
 

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

n°1406130
soulmanto
Chat Noir replica
Posté le 13-07-2006 à 09:37:59  profilanswer
 

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.

n°1406137
brasseld
Posté le 13-07-2006 à 09:47:00  profilanswer
 

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
n°1407877
Arjuna
Aircraft Ident.: F-MBSD
Posté le 17-07-2006 à 10:38:55  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Date et optimisation...

 

Sujets relatifs
optimisation calcul distance dans procédure stockée ?problème : mktime et date
Requête sur le mois et l'année d'une date...?tri sur date avec des jointures
date derniere connexiondate et php : extraire le mois d'une date SQL (debutant)
[VBA] Problème avec les formats de datewxWidgets déclencher un evenement à une date précise
Oracle dbtimzone date UTC[php/sql] mettre en archives données quand date dépassé
Plus de sujets relatifs à : Date et optimisation...


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