2010-10-11 19 views
0

我正在寻找在过去questians,但没有找到我一直在寻找的,在我的web应用程序,我需要得到以表中的所有记录,其中订单,其中订单在certian转变:当他们不在同一天时,我如何在两个日期之间得到一个时间?

  1. 一个班次只有一个开放日期和一个shiftTypes中的记录ID。

  2. shiftTypes持有移(隐含的)的开始和结束的

现在,人们与系统所有的工作时间,他们可以输入命令yestorday早晨和今日早盘的时间。

有些转变是在夜间,所以一些订单在转移是在一天和一些其他的。

我的问题是,当我试图得到一个班次中的订单时,我在班次的两个时间段内(通过班次类型)获得所有记录的贝克,但是对于错误的班次(这是yestorday夜晚例如扰)... ofcourse这种情况发生,并能onlyu发生的是在一夜之间,并延伸了两个diferent天班,becouse这两天在他们同样的时间....

我怎样才能得到我的转变记录?附:通过shiftId不工作....

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

回答

3

您应该创建开始和结束日期时间值,如果您有日期和时间分开你做太多更复杂的比较,使其工作。

如果转变开始于22:00一天,运行到次日06:00,您希望所有的记录22:00至24:00之间的第一次约会,和00之间的第二次约会: 00和06:00。如果将日期和时间组合在一起,以便您有一个适用于所有记录的范围,而不是根据日期应用不同的两个范围,则更容易。

我不知道你究竟是如何计算和使用@ShiftDate和@date值(也许你应该比较@starttime和@endtime,以确定是否移位经过午夜),但原则是:

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

提示:您可以在查询中使用@var = field,所以你并不需要为你想获得每个变量一个单独的查询:

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 :-)你可以看到我已经解决了这个问题,但是我感谢你的努力:-)我想我必须问奎斯蒂恩,并且吸一口雪茄来清理我的头......:-) – Erez 2010-10-11 12:53:50

+0

+1,'你应该创建开始和结束的日期时间值,如果你有独立的日期和时间,你必须做更复杂的比较才能使其工作。 – 2010-10-11 13:06:28

0

好,知道了!

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 

这是工作,我想它的方式.... 10X :-)

+1

你确定它的工作原理?范围@ ShiftDate + @ StartTime到@ Date + @ StartTime表明它是一个24小时的班次......我不确定它是否适用,但如果@ShiftDate和@Date是相同的,那么您将获得当天的所有记录@StartTime。 – Guffa 2010-10-11 12:55:41

相关问题