2017-08-13 86 views
4

我從使用創建的日期維度如下:營業時間邏輯和例外營業時間

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

這僅僅是一個標準之一,我已經加入2列OpeningTime與關閉時間開幕時間爲08:00:00,結束時間爲18:00:00。

我也有一個計算字段,計算開始時間和結束時間之間的差異作爲非持久計算字段。

我有以下邏輯,但在給你這個之前,讓我設置顯示業務情況的場景,所以他們通常從週一至週五的上午8點到下午6點以及週六上午8點 - 1pm

然而,規則可能會有例外,因爲它們可以打開的時間更長,甚至週日也可以打開。由於某些原因,我下面的代碼由於某些原因在星期日少了一些,因爲在罕見的情況下,如果他們是在週日上午8點到下午1點纔開放。顯然,無論延長開放時間他們是開放的,即使在星期天,我手動不得不將它添加到Dim_Date日曆,這對於開始時間和結束日期,我有00:00:00,兩者都給我一個0爲datediff in分鐘除非商家告訴我否則。

但是下面的代碼並沒有考慮到這一點,並且計算的結果小於它應該是的,如果有人可以請求提供解決方案,代碼有問題,基本上我只想讓代碼變得靈活,所以我只做了修改即使延長工作時間或不尋常的營業時間,也可以反映這種情況。謝謝。

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) 
+3

這麼多信......很難分辨是什麼問題正是,你能簡單地詢問你的問題作爲這篇文章的總數?只需將描述,問題和預期結果分開 – anatol

+0

您可以預測您正在尋找的樣本數據和結果嗎?這使我們更好地理解。 – Rex

+0

表達式'convert(nvarchar(8),@ Date1,112)'將返回格式爲'yyyymmdd'的日期字符串。您將該值分配給「時間」變量,因此結果將始終爲'00:00:00.0000000'。 –

回答

2

看看這個:

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

souldn't它是:

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

我不確定遵循您的邏輯,請添加數據樣本和預期結果 – Horaciux