如果他们不在同一天,我如何在两个日期之间获得时间?

时间:2010-10-11 12:21:46

标签: sql tsql

我正在搜索过去的问题,找不到我想要的东西,在我的网络应用程序中,我需要获得订单表中所有记录,其中订单在certian转移:

  1. 班次只有一个开放日期,而在shiftTypes中有一个记录ID。

  2. shiftTypes保存班次的开始和结束时间(隐式)

  3. 现在,人们一直在使用系统,他们可以在早上和今天早上输入订单。

    有些转变是一夜之间,所以那个转变中的一些订单在一天内完成,另一些在另一天中。

    我的问题是,当我试图只获得轮班中的订单时,我会在轮班的时间范围内(通过班次类型)获得所有记录,但是错误的班次(那个晚上的那个例子)...当然发生了,并且只能发生在过夜的转变并延续两个不同的日子,因为两天都有相同的时间......

    我怎样才能获得轮班中的记录?附:通过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: - )

2 个答案:

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