您可以在SQL查詢確定處理這個問題。如果你只是存儲時間,最好是將它作爲int 0000 - 2359
來完成。
所以我們的桌子看起來像這樣。
CREATE TABLE off_time (
id int(12) AUTO_INCREMENT,
employee int(12) NOT NULL,
start_time smallInt(4) unsigned NOT NULL,
end_time smallInt(4) unsigned NOT NULL,
PRIMARY KEY (id)
);
我們正在存儲一個開始和結束時間來創建一個他們不工作的時間塊。很明顯,在你的代碼中,確保這些塊有意義並且start_time < = end_time是很重要的。
現在我們來查詢。
// Here we use just <and> but you can make them <= and >= if you don't want time slots to possibly overlap start/end times.
SELECT ot.id, IF(1300 < ot.end_time AND 1900 > ot.start_time, 1, 0) AS blocked
FROM off_time as ot
WHERE ot.employee = 1;
你會得到一個表背,每一行都會有阻塞時隙的id
,並與1意味着它的封鎖和0意思是blocked
列事實並非如此。所以如果任何條目是1,那麼你知道你的時間被阻止了。這樣做也很方便,因爲您也可以將原因表關聯起來,並且能夠以某種原因作出迴應。 LEFT JOIN time_off_reasons as r on r.id = ot.id
如果你想具體的日期。只需存儲timestamp
開始和結束時間。比較將是相同的,只是用時間戳來代替。 0200隨着我,你會想要確保你的方法拆分那些除了作爲獨立的條目 -
編輯 馬克B.約時間塊上伸展的午夜馬克即2200提出的意見好點。
所以INSERT INTO off_time (start_time, end_time) VALUES(2200, 2400)(0000,0200)
這將仍然正常工作。但是,你將只有兩次輸入1次關閉塊,這可能很煩人,但比編寫額外的代碼來補償邏輯更容易。
這是在數據庫中還是隻是PHP? – chris85
實際上這些值將來自數據庫。但是我用已知的變量替換了它們。所以這是PHP –
首先,您是否確保您在代碼上使用的日期時間格式與您在數據庫中使用的格式相同?如果它已經是相同的,你能告訴我們格式嗎? – yogipriyo