2010-10-11 1 views
0

je cherchais dans les questians passées et ne pouvait pas trouver ce que je cherchais, dans mon application web que je dois obtenir tous les enregistrements dans le tableau de commande où les ordres où les commandes dans un changement certian:Comment avoir un temps entre deux dates quand elles ne sont pas dans la même journée?

  1. Un décalage a une date d'ouverture uniquement et un ID d'enregistrement dans shiftTypes.

  2. shiftTypes tient le temps de début et de fin d'un quart de travail (implicitement)

Maintenant, les gens travaillent avec le système tout le temps et ils pourraient entrer dans une matinée du matin et aujourd'hui yestorday de commande.

Certains quarts de travail ont lieu la nuit, de sorte que certains ordres de ce quart de travail sont en un jour et d'autres dans l'autre. Mon problème est que quand j'essaie d'obtenir seulement les ordres dans un quart de travail, je reçois tous les records des deux jours dans le temps d'un quart (par type de quart) mais pour le mauvais décalage aussi (Celui qui était hier soir par exemple) ... bien sûr cela arrive, et cela ne peut arriver que pour les quarts de nuit et s'étend sur deux jours différents, car les deux jours ont les mêmes heures en eux ....

Comment puis-je obtenir uniquement les enregistrements qui sont sur mon quart de travail? p.s. par shiftId ne fonctionne pas ....

----DEMO: spShiftCloseZ @Date='2010-10-11' 
alter procedure spShiftCloseZ 
@Date date 
as 
declare @ShiftID smallint 
declare @ShiftDate date 
declare @StartTime time(7) 
declare @EndTime time(7) 
set @ShiftID = (select top 1 ShiftID from dbo.Shifts order by ShiftID desc) 
set @ShiftDate = (select ShiftDate from dbo.Shifts where ShiftID = @ShiftID) 
set @StartTime = (select StartTime from dbo.Shifts s,dbo.ShiftTypes st 
       where s.ShiftTypeID=st.ShiftTypeID and ShiftID = @ShiftID) 
set @EndTime = (select EndTime from dbo.Shifts s,dbo.ShiftTypes st 
       where s.ShiftTypeID=st.ShiftTypeID and ShiftID = @ShiftID) 

select OrderID,  
     Total  

from dbo.Orders 
where OrderDate between @ShiftDate and @Date 
     --and 
     --OpenTime between @StartTime and @EndTime 


select  SUM(NumOfDiners) as NumOfDiners, 
      SUM(Total) as TotalAmount, 
      OrderDate 

from dbo.Orders 
where OrderDate between @ShiftDate and @Date 
     and 
     OpenTime between @StartTime and @EndTime 
group by OrderDate 

10 :-)

Répondre

3

Vous devez créer début et de fin des valeurs datetime, si vous avez la date et l'heure que vous devez séparer faire beaucoup comparaisons plus compliquées pour le faire fonctionner.

Si un poste commence à 22h00 un jour et se termine à 06h00 le jour suivant, vous voulez tous les enregistrements pour la première date entre 22h00 et 24h00, et pour la deuxième date entre 00: 00 et 06:00. C'est plus facile si vous combinez la date et l'heure pour que vous ayez une plage qui s'applique à tous les enregistrements au lieu de deux qui s'appliquent différemment selon la date.

Je ne sais pas exactement comment vous calculer et d'utiliser les valeurs de @ShiftDate et @date (peut-être vous devriez comparer les @StartTime et @EndTime pour déterminer si le changement passe minuit), mais le principe serait:

where OrderDate + OpenTime between @ShiftDate + @StartTime and @Date + @EndTime 

Astuce: vous pouvez utiliser @var = field dans une requête, de sorte que vous n'avez pas besoin d'une requête distincte pour chaque variable que vous souhaitez obtenir:

select 
    @ShiftDate = s.ShiftDate, 
    @StartTime = st.StartTime, 
    @EndTime = st.EndTime 
from dbo.Shifts s 
inner join dbo.ShiftTypes st on s.ShiftTypeID = st.ShiftTypeID 
where s.ShiftID = @ShiftID 
+0

10x :-) comme vous pouvez le voir, j'ai résolu le problème, mais je vous remercie pour l'effort :-) Je suppose que je devais poser le questian, et fumer une cigaret pour obtenir la tête claire ...:-) – Erez

+0

+1, 'Vous devez créer des valeurs de date et heure de début et de fin, si vous avez la date et l'heure séparées, vous devez faire des comparaisons beaucoup plus compliquées pour le faire fonctionner. –

0

OK, Got it !!!

alter procedure spShiftCloseZ 
@Date date 
as 
declare @ShiftID smallint 
declare @ShiftDate date 
declare @StartTime time(7) 
declare @EndTime time(7) 
set @ShiftID = (select top 1 ShiftID from dbo.Shifts order by ShiftID desc) 
set @ShiftDate = (select ShiftDate from dbo.Shifts where ShiftID = @ShiftID) 
set @StartTime = (select StartTime from dbo.Shifts s,dbo.ShiftTypes st 
       where s.ShiftTypeID=st.ShiftTypeID and ShiftID = @ShiftID) 
set @EndTime = (select EndTime from dbo.Shifts s,dbo.ShiftTypes st 
       where s.ShiftTypeID=st.ShiftTypeID and ShiftID = @ShiftID) 

select OrderID,  
     Total  

from dbo.Orders 
where OrderDate = @Date 
     and 
     OpenTime < @StartTime 
     or 
     OrderDate = @ShiftDate 
     and 
     OpenTime > @StartTime 


select  SUM(NumOfDiners) as NumOfDiners, 
      SUM(Total) as TotalAmount, 
      OrderDate 

from dbo.Orders 
where OrderDate between @ShiftDate and @Date 
     and 
     OpenTime between @StartTime and @EndTime 
group by OrderDate 

Cela fonctionne comme je le veux .... 10x :-)

+1

Etes-vous sûr que ça marche? La plage @ ShiftDate + @ StartTime à @ Date + @ StartTime suggère que c'est un décalage de 24 heures ... Je ne suis pas sûr si cela s'applique, mais si @ShiftDate et @Date sont les mêmes, vous obtenez tous les enregistrements pour ce jour indépendamment de @StartTime. – Guffa