营业时间逻辑和营业时间例外

时间:2017-08-13 11:07:14

标签: sql sql-server

我已使用以下内容创建了日期维度:

https://www.codeproject.com/Articles/647950/Create-and-Populate-Date-Dimension-for-Data-Wareho

这只是一个标准版本,我为OpeningTime和Closing Time添加了2列,其值为Opening为08:00:00,Closing为18:00:00。

我还有一个计算字段,它将开始时间和结束时间之间的分钟差异计算为非持久计算字段。

我在下面有以下逻辑,但在给你这个之前,让我设置一个显示业务情况背景的场景,所以它们通常在周一至周五上午8点至下午6点开放,周六早上8点开放 - 下午1时

然而,规则可能有例外,因为它们可以打开更长时间甚至是星期日。由于某种原因,我在下面因为某些原因而在星期日显示较少,因为在极少数情况下,如果他们为了争论而在周日早上8点到下午1点开放。很明显,无论延长开放时间,即使在星期天,它也是开放的,我会手动将它添加到Dim_Date日历中,对于starttime和enddate,我有00:00:00,因为两者都给了我一个0的日期。默认,除非业务另有说明。

但是下面的代码没有考虑到这一点并且计算得比它应该少,代码有问题,如果有人可以提供解决方案,基本上我只是希望代码是灵活的所以我只做了更改日历甚至延长工作时间或不寻常的工作时间以及反映这一点的代码。谢谢。

declare @Date1 datetime = '2017-08-01 08:00:00'
declare @Date2 datetime = '2017-08-07 09:10:00'


declare @StartTime time = cast(@Date1 as time)
declare @EndTime time = cast(@Date2 as time)
declare @CCStartTime time = (select StartTime from dim_date where id = convert(nvarchar(8),@Date1,112))
declare @CCEndTime time = (select EndTime from dim_date where id = convert(nvarchar(8),@Date2,112))


declare @ActualStart time = (select case 
            when datename(DW,@Date1)='Sunday' then '00:00:00'
            when @StartTime between '00:00:00' and @CCStartTime then @CCStartTime
            when @StartTime between  @CCStartTime and @CCEndTime then @StartTime
            when @StartTime between @CCEndTime and  '23:59:59' then @CCEndTime end)

declare @ActualEnd time = (select case 
            when datename(DW,@Date2)='Sunday' then '00:00:00'
            when @EndTime between '00:00:00' and @CCStartTime then @CCStartTime
            when @EndTime between @CCStartTime and @CCEndTime then @EndTime
            when @EndTime between @CCEndTime and '23:59:59' then @CCEndTime end)


declare @DiffrenceStart int = isnull(DATEDIFF(minute,@CCStartTime,@ActualStart),0)

declare @DiffrenceEnd int = isnull(DATEDIFF(minute,@ActualEnd,@CCEndTime),0)

/*
select @StartTime as StartDate
select @EndTime as EndDate
select @CCStartTime as CCStartDate
select @CCEndTime as CCEndDate
select @ActualStart as ActualStart
select @ActualEnd as ActualEnd
select abs(@DiffrenceStart) as DiffrenceStart 
select abs(@DiffrenceEnd) as DifrenceEnd
*/



select sum(Min)- (@DiffrenceStart + @DiffrenceEnd)
from dim_date
where id between convert(nvarchar(8),@Date1,112) and convert(nvarchar(8),@Date2,112)

1 个答案:

答案 0 :(得分:2)

看看这个:

declare @ActualEnd time = (select case 
            when datename(DW,@Date2)='Sunday' then '00:00:00'
不应该是:

declare @ActualEnd time = (select case 
            when datename(DW,@Date2)='Sunday' then '23:59:59'