我正在搜索过去的问题,找不到我想要的东西,在我的网络应用程序中,我需要获得订单表中所有记录,其中订单在certian转移:
班次只有一个开放日期,而在shiftTypes中有一个记录ID。
shiftTypes保存班次的开始和结束时间(隐式)
现在,人们一直在使用系统,他们可以在早上和今天早上输入订单。
有些转变是一夜之间,所以那个转变中的一些订单在一天内完成,另一些在另一天中。
我的问题是,当我试图只获得轮班中的订单时,我会在轮班的时间范围内(通过班次类型)获得所有记录,但是错误的班次(那个晚上的那个例子)...当然发生了,并且只能发生在过夜的转变并延续两个不同的日子,因为两天都有相同的时间......
我怎样才能获得轮班中的记录?附:通过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: - )
答案 0 :(得分: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
答案 1 :(得分: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: - )