我從使用創建的日期維度如下:營業時間邏輯和例外營業時間
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)
這麼多信......很難分辨是什麼問題正是,你能簡單地詢問你的問題作爲這篇文章的總數?只需將描述,問題和預期結果分開 – anatol
您可以預測您正在尋找的樣本數據和結果嗎?這使我們更好地理解。 – Rex
表達式'convert(nvarchar(8),@ Date1,112)'將返回格式爲'yyyymmdd'的日期字符串。您將該值分配給「時間」變量,因此結果將始終爲'00:00:00.0000000'。 –