Gestion de tranches horaires sur deux jours

Gestion de tranches horaires sur deux jours - SQL/NoSQL - Programmation

Marsh Posté le 02-07-2008 à 17:48:36    

Bonjour toutes et tous,
 
Mon sujet de message n'étant pas très expressif, voici mon soucis du moment:
J'ai besoin de renvoyer un champs donnant le nom de la tranche horaire dans laquelle je me trouve actuellement.
Voici un exemple de la table "Tranche" (Start et End sont des entiers, par exemple: 2000 pour 20h ou 0115 pour 1H15)
idtranche   Start_Tranche   End_Tranche    Nom_Tranche
1              0800                0930               T1
2              2200                0200               T2
etc...
 
Mon soucis se situe lorsque la tranche est situé sur deux jours (exemple avec id 2 de 22H à 2h le lendemain) car je ne peux pas faire de comparaison de temps avec les minutes comme effectué ci dessous:
SELECT     IDTranche
FROM         Tranche
WHERE     (DATEPART(hh, GETDATE()) * 60 + DATEPART(n, GETDATE()) BETWEEN LEFT(Start_Tranche, 2) * 60 + RIGHT(Start_Tranche, 2) AND LEFT(End_Tranche, 2)  
                      * 60 + RIGHT(End_Tranche, 2))
 
J'ai essayé de convertir avec des formats dates mais je ne m'en sors pas.
 
Donc si vous avez une idée je suis preneur.
 
Merci d'avance.
 
Jumpup
 

Reply

Marsh Posté le 02-07-2008 à 17:48:36   

Reply

Marsh Posté le 02-07-2008 à 17:52:44    

sans tester, copier/coller rapide :
 

Code :
  1. SELECT     IDTranche
  2. FROM         Tranche
  3. WHERE     case sign(start_tranche - end_tranche) when 1 then (DATEPART(hh, GETDATE()) * 60 + DATEPART(n, GETDATE()) BETWEEN LEFT(Start_Tranche, 2) * 60 + RIGHT(Start_Tranche, 2) AND LEFT(End_Tranche, 2)  
  4.                      * 60 + RIGHT(End_Tranche, 2))  else (DATEPART(hh, GETDATE()) * 60 + DATEPART(n, GETDATE()) BETWEEN LEFT(End_Tranche, 2) * 60 + RIGHT(End_Tranche, 2) AND LEFT(Start_Tranche, 2)  
  5.                      * 60 + RIGHT(Start_Tranche, 2))
  6. end

Reply

Marsh Posté le 02-07-2008 à 18:11:35    

MagicBuzz a écrit :

sans tester, copier/coller rapide :
 

Code :
  1. SELECT     IDTranche
  2. FROM         Tranche
  3. WHERE     case sign(start_tranche - end_tranche) when 1 then (DATEPART(hh, GETDATE()) * 60 + DATEPART(n, GETDATE()) BETWEEN LEFT(Start_Tranche, 2) * 60 + RIGHT(Start_Tranche, 2) AND LEFT(End_Tranche, 2)  
  4.                      * 60 + RIGHT(End_Tranche, 2))  else (DATEPART(hh, GETDATE()) * 60 + DATEPART(n, GETDATE()) BETWEEN LEFT(End_Tranche, 2) * 60 + RIGHT(End_Tranche, 2) AND LEFT(Start_Tranche, 2)  
  5.                      * 60 + RIGHT(Start_Tranche, 2))
  6. end



 
Merci beaucoup je pense que la soustraction est une très bonne voie cependant quand je teste J'ai l'impression qu'il accepte mal le between dans le "then" car j'ai beau essayé d'ajouter des parenthèses rien y fait ou sinon on met ça sur la fin de journée ;)
 
Merci encore

Reply

Marsh Posté le 02-07-2008 à 18:19:58    

oui effectivement, tu vas certainement devoir réécrire autrement cette partie.
 
mais en gros, il faut partir sur un test de sign(end-start)
=> si 1 : alors c'est une tranche qui est dans la journée
=> si -1 : alors c'est une tranche qui est sur deux journées
=> si 0 : alors c'est une heure fixe
 
ps : ça ne marche que si la tranche fait moins de 24 heures de long. à la 25° heure, tu auras un comportement inversé !
 
en gros, il serait judicieux je pense de rajouter une notion de jour dans la table, ou une durée après l'heure de début si ce sont des intervals récurents

Reply

Marsh Posté le 03-07-2008 à 14:16:57    

Bonjour Toutes et tous,
 
Je n'arrive toujours pas à le faire j'ai beau essayé avec des requêtes imbriquées ou autre, je ne m'en sors pas...
 
Peut on effectuer un case dans un where?  
 
Merci de vos réponses

Reply

Marsh Posté le 03-07-2008 à 15:00:04    

oui

Reply

Marsh Posté le 03-07-2008 à 15:01:06    

ceci dit, un petit
 
where (sign() = 1 and ...) or (sign() = -1 and ...)
 
fera tout aussi bien l'affaire et sera limite plus lisible

Reply

Marsh Posté le 03-07-2008 à 16:06:17    

Yeah Yeah Yeah!
 
Avec les bons conseils de MagicBuzz j'y suis arrivé!  
 
Merci encore

Reply

Sujets relatifs:

Leave a Replay

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