2010-10-11 49 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

相關問題