2016-08-25 53 views
1

我有一個表,由最初的便利店等的時間表結束時,一些結構類似獲取夜間兩個時間之間的時間以早上

| SCHEDULE_NAME | START_HOUR | END_HOUR | 
| ------------- | ------------- | --------- | 
| Morning Shift | 8:00   | 10:00  | 
| Evening Shift | 13:00   | 17:00  | 
| Night Shit | 22:00   | 2:00  | 

所以我要驗證,如果一個小時的開始和結束之間小時,我有所有的時間作爲日期運行到這種類型的驗證函數中的表

DECLARE @HOUR time = '9:00' 
IF @HOUR BETWEEN @START_HOUR AND @END_HOUR 
SELECT 'IS BETWEEN' 
ELSE 
SELECT 'IS NOT' 

所以它工作正常的時間表,其中其他(前兩種情況後,開始時間和結束時間是一個),但在第三種情況下,通宵計劃,因爲它認爲結束時間較低,所以失敗n個小時,這樣的情況下

DECLARE @HOUR time = '1:00' 
-- Here START_HOUR is '22:00' AND END_HOUR is '2:00' 
IF @HOUR BETWEEN @START_HOUR AND @END_HOUR 
SELECT 'IS BETWEEN' 
ELSE 
SELECT 'IS NOT' 

所以它返回IS NOT但應該考慮到,它是調度之間

以防萬一,沒有時間表結束和開始時間可以是相同的和我使用的SQL Server 2014

+0

存儲倍日期時間? 如果是的話,你可以嘗試檢索數據的日期時間再上加入+1天END_HOUR萬一START_HOUR比END_HOUR更大。 – insilenzio

+0

@insilenzio它們存儲時間,不DATETIME和DATEADD函數沒有工作 –

回答

1

我看到一個設計問題他們。作爲@insilenzio在他的評論中說,你要保存的數據作爲的DateTime,不時間

但是你可以做比較之前將數據轉換爲datetime,設置END_DATE greatter比star_date,並確保小時的檢查是對end_date之間的同一天。 例如,以您的最後一個示例爲例:

Change hour to : '2016-01-02 09:00:00' 
Change star_hour to: '2016-01-01 22:00:00' 
Change end_hour to: '2016-01-02 02:00:00' 

然後,您的代碼將無任何問題地工作。正如我所說的,你必須確保@HOUR與@END_HOUR同一天。如果沒有,明顯的原因將無法正確運行。

正如你可以在SQL Server 2012,並使用示例代碼更大:(也許你將不得不糾正sintax,但它是近距離工作)

DECLARE @HOUR Datetime = '2016-01-02 01:00:00' 
IF @HOUR BETWEEN (cast('2016-01-01' as datetime) + cast(@START_HOUR as datetime)) AND (cast('2016-01-02' as datetime) + cast(@END_HOUR as datetime)) 
SELECT 'IS BETWEEN' 
ELSE 
SELECT 'IS NOT' 
0

我建議你轉換時間(分鐘)和使一些calculationf在午夜情況:

DECLARE @HOUR time = '21:00' 
DECLARE @START_HOUR time = '22:00' 
DECLARE @END_HOUR time = '02:00' 

DECLARE @START_MINUTES int = DATEPART(HOUR,@START_HOUR)*60 + DATEPART(MINUTE,@START_HOUR) 
DECLARE @END_MINUTES int = DATEPART(HOUR,@END_HOUR)*60 + DATEPART(MINUTE,@END_HOUR) 
DECLARE @MINUTES int = DATEPART(HOUR,@HOUR)*60 + DATEPART(MINUTE,@HOUR) 

IF (@MINUTES < @START_MINUTES) 
BEGIN 
    SET @MINUTES = @MINUTES + 24 * 60 
END 

IF (@START_MINUTES < @END_MINUTES AND @MINUTES BETWEEN @START_MINUTES AND @END_MINUTES) OR (@START_MINUTES >= @END_MINUTES AND @MINUTES BETWEEN @START_MINUTES AND (@END_MINUTES + 24 * 60)) 
SELECT 'IS BETWEEN' 
ELSE 
SELECT 'IS NOT' 
1

如果我們堅持time類型,那麼一個可能的方法是檢查兩個區間 - 最高午夜,午夜。

DECLARE @HOUR time = '1:00'; 
DECLARE @START_HOUR time = '22:00'; 
DECLARE @END_HOUR time = '2:00'; 

IF @END_HOUR < @START_HOUR 
BEGIN 
    -- interval goes across the midnight 
    IF @HOUR BETWEEN @START_HOUR AND '24:00' 
     OR @HOUR BETWEEN '00:00' AND @END_HOUR 
     SELECT 'IS BETWEEN' 
    ELSE 
     SELECT 'IS NOT' 
    ; 
END ELSE BEGIN 
    -- interval is within the same day 
    IF @HOUR BETWEEN @START_HOUR AND @END_HOUR 
     SELECT 'IS BETWEEN' 
    ELSE 
     SELECT 'IS NOT' 
    ; 
END; 

結果

(No column name) 
IS BETWEEN 

如果我們可以用datetime,那麼我乾脆24小時添加到@END_HOUR

相關問題