2014-03-04 96 views
2

我一直在思考這個問題時有點麻煩。我似乎無法定義一個SELECT查詢,它足夠準確,可以給我我想要的結果。SQL SELECT邏輯

我在一個表中存儲換檔模式。這些換檔模式沒有關於何時可以開始和結束(除了它們不能重疊每個機器彼此)

這是表的結構(5行例子的數據) Table

任何限制

我有選擇的唯一信息是:

  • 當前時間(例如01:45)
  • 當前工作日(如星期二)

問題是當一個班次重疊00:00。所以我的問題是這樣的:

如何根據當前時間和工作日選擇當前班次?

Here is an SQL Fiddle of the scenario

謝謝!

+3

+1 for SQL小提琴! –

+3

1.停止對所有列使用「VARCHAR」。平日使用'TINYINT',時間欄使用'TIME'。 2.請將sqlfiddle的代碼添加到您的帖子中。 – hjpotter92

+0

你是否陷入了這個可怕的表模式,還是你可以改變它? –

回答

2

你可以用簡單的邏輯來做到這一點。如果StartTime < EndTime,那麼你想測試兩個值之間的時間。如果Startime > EndTime,那麼你想測試兩次值之間的時間而不是。所以這解決了時間問題:

SELECT * 
FROM webreportshiftsetup 
WHERE (StartTime < EndTime and time(now()) between StartTime and EndTime or 
     StartTime > EndTime and time(now()) not between StartTime and EndTime 
    ) and 
     dayname(now()) in (StartWeekDay, EndWeekDay) 

你有一個類似的問題與工作日。但是你的問題具體是關於時間而不是平日。 (這也許應該是另一個問題。)

+0

嗨,感謝所有的答案。這個答案讓我最接近! (我已經和我們的客戶進行了討論,並且他們準備將每年的班次時間表上傳到數據庫,這使得整個過程變得更容易! –

1

如果你的變化是一天(也就是你需要選擇僅當天),你可以這樣做

SELECT * FROM shifts 
WHERE startWeekDay = DATE_FORMAT(CURDATE(),'%W') AND NOW() BETWEEN startTime AND endTime 

否則,如果您的轉移從星期一開始和結束週三,今天是星期二,您將無法通過查詢找到今天的轉變。爲此,你應該存儲天數爲:1-星期一,2-星期五,...

+0

我能夠將日期存儲爲數字,我可以根據需要更改模式。我已經這樣做了,而且我仍然遇到同樣的問題,因爲我必須選擇的唯一數據是當前時間和當前星期幾(這將是一個數字,但這不是一個有效的相同問題?) –

+0

如果你的班次在同一天開始和結束,那麼同樣的問題,但是如果你有一個班次在星期一開始到星期五結束,今天是在兩天之間,那麼找到正確的班次要容易得多。你是否有一天開始換班,結束另一天? –

0

我建議你改變模式。一種選擇是將datetime類型用於開始/結束,而不是對所有內容使用varchar。

然後你就可以查詢它想:

SELECT * 
FROM webreportshiftsetup 
WHERE NOW() BETWEEN StartDateTime AND EndDateTime 

等等。

如果您需要重複某些日期,那麼您可以將StartDay/EndDay列設置爲tinyint,並給它們一個1-7的值,其中最小的數字是第一天本週的最後一天是最大的數字。開始時間/結束時間將是date類型。查詢如下:

SELECT * 
FROM webreportshiftsetup 
WHERE StartDay >=2 AND EndDay <=4 AND StartTime >= '2:00' AND EndTime <= '13:00' 
+0

感謝您的回答,是的,它是一個重複的數據集(好吧,它基本上是一個設置表,它定義了7天內的換檔模式)。這是什麼導致這個問題基本上,因爲我不能說BETWEEN開始和結束 –