2011-10-31 44 views
2

在項目我的工作,現在的系統存儲員工的表中的時間表結構如下:MySQL:查詢與時間表一起工作?

employee_id | mon_h_s | mon_m_s | mon_h_e | mon_s_e | tue_h_s | tue_m_s | etc. 
------------------------------------------------------------------------------ 
     1   06   00  14  30  06  00  ... 
     2   18   30  07  00  21  00  ... 

其中:

mon_h_s - 週一小時開始

mon_m_s - 星期一分鐘開始

mon_h_e - 星期一結束時

mon_m_e - 週一分鐘結束

tue_... - 週二...

每天一週有4個領域:小時開始,分鐘開始,結束時間,分結束。

所以,從上表中我們可以看到:

  • 員工與ID 1個作品從06:0014:30週一

  • 員工與ID 2作品從18:3007:00星期一(巴sically,週一和週二之間,在晚上)

的問題是,我不知道如何創建一個SQL查詢,其考慮的一切,包括時間上重疊(在晚上的時間)。例如,我們需要找到週二上午6點(06:00)工作的員工。在我們的案例中,兩名員工(id 1和id 2)都能滿足這個標準。身份證1的員工週二06:00開始工作,身份證2的員工在週二的07:00之前工作(從週一開始)。

關於如何解決這個問題的任何建議將不勝感激。

+0

簡易過濾+ 1 SQL不會讓你想做的事情變得容易 – pilcrow

+0

不需要將小時和分鐘分隔成它們自己的屬性,就像SQ L'TIME'類型可以充分表示HH:MM:SS。 – pilcrow

回答

0

可能的東西來完成,如:

SELECT (1440 + ((mon_h_e*60)+mon_m_e) - ((mon_h_e*60)+mon_m_e)) % 1440 

這會給你幾分鐘的工作時間。基本上,它(在一天分鐘,或24小時60分鐘* /小時)增加了1440到結束時間之間的區別和開始時間,並保持1440

其餘的(模)現在的設計部分:

如果可以,請重新設計您的餐桌。你的桌子不需要一週中的所有星期幾,這將使每週的時間非常單調乏味。

你應該考慮使用真正的日期時間。

 
employee_id | entrytime   | exittime 
      1 | 2011-10-31 06:00:00 | 2011-10-31 14:30:00 
      1 | 2011-11-01 06:00:00 | null 
      2 | 2011-10-31 18:30:00 | 2011-11-01 07:00:00 
      2 | 2011-11-01 21:00:00 | null 

這樣一來,您有:

  1. 完全訪問所有日期和時間函數在MySQL
  2. 持續時間的簡單計算
  3. 不完整的週期
+0

@AndriyM謝謝,我猜輸入的太快了。 – MPelletier

-2

有你需要O句柄

A -> when time of lecture starts before given time 
B -> when time of lecture starts after given time but falls within range of ending time 
C -> when time of lecture starts within given time but ends after 
D -> when time of lecture starts before given time and ends after given time 

現在四個基本情況下,這可以通過使用簡單的OR條件

There are four basic cases that u need to handle, A, B,C and D

+2

你確定這是這個問題的答案嗎?當OP涉及「員工時間表」時,你提到「講座」。當OP詢問跨越日界的抽象間隔規格中的時間點時,可以繪製重疊間隔。你不會顯示任何與OP的發佈模式相關的SQL - 這些設計的列不適用於「簡單OR條件」。 – pilcrow