[SQL]Calculer le nombre de lundi entre 2 dates

Calculer le nombre de lundi entre 2 dates [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 28-04-2009 à 15:44:37    

Bonjour,
 
Je cherche la méthode la plus évidente pour calculer le nombre de lundi (par exemple) entre 2 dates, sachant que la date de début et/ou la date de fin peuvent être un lundi ou non.
 
Je connais bien les fonctions sur les dates en sql (la je bosse sous sybase, mais je me débrouillerais si on me file une syntaxe MYSQL), c'est juste une histoire de logique en sorte.
 
Merci  :hello:  

Reply

Marsh Posté le 28-04-2009 à 15:44:37   

Reply

Marsh Posté le 28-04-2009 à 16:18:16    

- Compter le nombre de jours entre les deux date.
- Diviser ce nombre par 7. Cela donne N, auquel il faudra peut-être ajouter 1.
- Récupérer le reste de la division par un modulo 7
- Si le reste est supérieur à 0, par exemple 3, il va falloir rechercher s'il y a un lundi dans ces trois jours.
- Récupérer le numéro du jour de la semaine de la date du début avec un datepart(), et comparer ce nombre avec le reste de la division. Faire un petit tableau sur papier de tous les cas pour faire la bonne comparaison et pour ne pas oublier de cas.

Reply

Marsh Posté le 29-04-2009 à 11:29:55    

Bon j'ai apparement fini, j'ai écris ça sous forme de procédure pour que ça soit plus compréhensible mais je l'ai intégré à mon projet dans une seule requete.

 
Code :
  1. CREATE procedure nbJourSemaine
  2. @dateDebut date,
  3. @dateFin date,
  4. @jourSemaine int
  5. AS
  6. BEGIN
  7.     declare @nbSemaines int
  8.     declare @joursRestants int
  9.     SET @nbSemaines = datediff(day, @dateDebut, @dateFin)/7
  10.     SET @joursRestants = datediff(day, @dateDebut, @dateFin)%7    
  11.     
  12.     SELECT
  13.     @nbSemaines+
  14.     (
  15.         CASE
  16.             when @joursRestants >0
  17.                 then
  18.                     CASE                    
  19.                         when datepart(weekday, dateadd(day, -1*@joursRestants, @dateFin)) > DATEPART(weekday,@dateFin)
  20.                         then
  21.                             case
  22.                                 when @jourSemaine < datepart(weekday, dateadd(day, -1*@joursRestants, @dateFin)) AND  @jourSemaine > DATEPART(weekday,@dateFin) then 0
  23.                                 else 1
  24.                             end
  25.                         when datepart(weekday, dateadd(day, -1*@joursRestants, @dateFin)) < DATEPART(weekday,@dateFin)
  26.                         then
  27.                             case
  28.                                 when @jourSemaine >= datepart(weekday, dateadd(day, -1*@joursRestants, @dateFin)) AND  @jourSemaine <= DATEPART(weekday,@dateFin) then 1
  29.                                 else 0
  30.                             end                        
  31.                     end
  32.             else 0
  33.         end
  34.     )
  35. END;


Message édité par Alisteroid le 29-04-2009 à 11:32:09
Reply

Marsh Posté le 29-04-2009 à 13:21:30    

Le nombre de lundi se calcule très facilement :  
1. Jour (0,6, 0 lundi) de la première date
2. Compter le nombre de jours entre les deux dates
3. Faire int((2)-(1) / 7)
 

Reply

Marsh Posté le 29-04-2009 à 13:31:56    

J'ai pas compris la, tu peux expliquer un peu plus ?
( et pour moi le 1 est le lundi, 7 le dimanche).

 

Le numero de jour est un parametre,  par exemple je veux du 02 avril au 25 avril je veux obtenir (j'y arrive mais si y a plus simple)

 

Numero jour   NB
0  3
1  3
2  3
3  3
4  4
5  4
6  4

 

Je vois pas ou est le numero du jour que je cherche dans ce que tu proposes


Message édité par Alisteroid le 29-04-2009 à 14:11:51
Reply

Marsh Posté le 29-04-2009 à 17:54:58    

Sur un exemple, pour reprendre le tien, du 2 avril (un jeudi) jusqu'au 25 (un samedi). Je vais partir sur ta base, c'est à dire lundi = 1 et dimanche = 7.  
 
L'idée est la suivante : si tu souhaites compter le nombre de lundi, le plus simple est de se ramener au lundi de la semaine du jour de départ (dans le cas de notre exemple, on est le 30 mars). Ensuite, on compte le nombre de semaines entières qu'il y a jusqu'à la date de fin décalée.  
 
Donc : le premier jour est un 4 (jeudi, en débutant à 1 pour le lundi). On doit donc décaler de 3 jours (si, comme dans mon message précédent, on débute à 0, on décale exactement du numéro du jour). Puisqu'on se décale de 3 jours, la date de fin doit aussi se décaler. En réalité, on ne touche pas à la date de fin (qui ne nous intéresse pas), mais on va plutot compter le nombre de jours. Puisqu'il y a 25-2+1 jours entre tes deux dates, cela nous donne (24-3)/7 = 3 lundis entre les deux dates.  
 

Reply

Sujets relatifs:

Leave a Replay

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