2016-02-22 242 views
2

我想插入一個綁定到某人的時間到數據庫中。 例如:彼得13:00 - 19:00PHP檢查時間範圍是否在一個時間範圍內

彼得告訴我們,他不能在18:00 - 22:00工作。 (這是位於數據庫中)。

因此,時間13:00 - 19:00不能插入到數據庫中,因爲結束時間(19:00)在時間範圍18:00 - 22:00之內。

如何檢查?

我試了幾件事,但我不知道如何做到這一點。

得到這個權利現在

$van_besch = '18:00'; 
$tot_besch = '22:00'; 

$van = '13:00'; 
$tot = '19:00'; 

if (($van_besch >= $van) && ($tot_besch <= $tot)) { 
     $error ='<font color="red">Time '.$van_besch.' - '.$tot_besch.' Not available</font>'; 
    } 

這是行不通的。

感謝您的閱讀!

+0

這是在數據庫中還是隻是PHP? – chris85

+0

實際上這些值將來自數據庫。但是我用已知的變量替換了它們。所以這是PHP –

+0

首先,您是否確保您在代碼上使用的日期時間格式與您在數據庫中使用的格式相同?如果它已經是相同的,你能告訴我們格式嗎? – yogipriyo

回答

1

實際上有兩種情況下,你必須檢查:

  1. $van等於或$van_besch$tot_besch

  2. $tot之間

  3. 等於或 $van_besch$tot_besch之間

如果$van$tot均在$van_besch$tot_besch之間均爲真。

此外,您還需要處理跨越一天休息的班次,例如, 17:00至02:00另一個問題是你需要處理的是20:00 - 0:00,因爲0:00小於20:00。

因此,我們將實時投影到我們自己的時間格式。 這意味着17:00 - 02:00將成爲17:00 - 26:00。請注意,我們需要爲$van_besch - $tot_besch$van - $tot$執行此操作。

在代碼看起來是這樣的:

if ($tot < $van){ 
    $tot = 24:00 - $van + $tot; 
} 

if ($tot_besch < $van_besch){ 
    $tot = 24:00 - $van + $tot; 
} 

if (($van >= $van_besch) && ($van <= $tot_besch)) || (($tot >= $tot_besch) && ($tot <= $tot_besch)){ 
... Peter is not available ... 
} 
+0

您實際上可以將兩種邏輯組合成一個語句。 '$ van <= $ tot_besch && $ tot> = $ van_besch'。但是,您還需要確保在所有情況下,$ van <= $ tot'和'$ van_besch <= $ tot_besch'。但基本上,這將涵蓋時間間隔之間的任何時間段,最終重疊或在開始重疊,在一個簡短的比較。 – Squeegy

+0

@squeegy這正是我需要的答案。這完美的作品!例如,它僅在17.00 - 02.00時不起作用。需要弄清楚什麼。那 –

+0

@StanvanderAvoird看看我的答案吼叫。我談論這個問題,並將它分成兩個比較,在午夜時分,或者一個超級便宜的方法是在結束時間增加24小時,這樣就是'17:00 - 26:00',只要確保你做到了如果它在午夜過後,你的其他時間也是如此。 – Squeegy

-1

您可以在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次關閉塊,這可能很煩人,但比編寫額外的代碼來補償邏輯更容易。

0

你最好轉換它們並使用strtotime進行比較。像這樣的東西會爲你工作:

$van_besch = '18:00'; 
$tot_besch = '22:00'; 

$van = '13:00'; 
$tot = '19:00'; 

if (strtotime($van) < strtotime($van_besch) || strtotime($tot) > strtotime($tot_besch)) { 
    //code goes here 
} 
+0

其實最好的方法是使用'DateTime',因爲它考慮時區和DST。 – h2ooooooo

+0

是的,像這樣的'$ exampleTime = new DateTime($ van)'會做的伎倆,然後比較它們。 –

相關問題