【问题标题】:Business Hours Logic and exceptions to Opening Hours营业时间逻辑和营业时间的例外情况
【发布时间】:2018-01-21 10:00:22
【问题描述】:

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

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 的 datediff in min by除非商家另有说明,否则默认。

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

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)

【问题讨论】:

  • 这么多字母...很难区分到底是什么问题,你能简单地问一下你的问题吗?只划分描述、问题和预期结果
  • 您能投影出您正在寻找的样本数据和结果吗?这让我们更好地理解。
  • 表达式convert(nvarchar(8),@Date1,112) 将返回格式为“yyyymmdd”的日期字符串。您将该值分配给 time 变量,因此结果将始终为“00:00:00.0000000”。

标签: sql sql-server


【解决方案1】:

看看这个:

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'

【讨论】:

  • 我不确定是否遵循您的逻辑,请添加数据样本和预期结果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-11
  • 2011-02-12
  • 2014-05-31
  • 1970-01-01
  • 2021-07-15
相关资源
最近更新 更多