[英]SQL statements selecting rows
好的,所以我試圖從DB中選擇行,看看日歷中是否有任何沖突,我遇到了另一個問題
這是我的代碼
$query3 = $dbh->prepare("SELECT * FROM calendar_" . $companyID . " WHERE (calTime+duration) > :calstart AND (calTime+duration) <= (:calend + (duration-(:calend-calTime))) AND agentID = :agentID ORDER BY calTime ASC");
$query3->bindParam(':calstart', $time);
$calend = $time + $duration;
$query3->bindParam(':calend', $calend);
在更易讀的SQL中看起來像這樣的東西
SELECT * FROM calendar_01 WHERE (calTime + duration) > 1331386200
AND (calTime + duration) <= ( 1331388000 + ( duration - ( 1331388000 - calTime ) ) )
AND agentID =1
ORDER BY calTime ASC
LIMIT 0 , 30
下邊界顯然工作正常,但是上邊界我有問題,如果一個事件的持續時間是7200 2小時,有人試圖進入一個新的事件,只說1800長度,並在第一個之后開始1800它將允許它即使輸入的事件長達7200,實際上也會超出新事件。 因此,我需要上邊界是動態的,如果:calend <(calTime + duration)然后選擇行,否則使用:calend作為上邊界。
我雖然對於我嘗試的內容幾乎是正確的但是這一部分
( 1331388000 + ( duration - ( 1331388000 - calTime ) ) )
在某些情況下,最終減去負數,因此上邊界很大,並且當它們不應該包括行時
您似乎正在查看新條目是否與任何現有條目重疊。 新條目由開始時間(在您的示例中為1331386200)和持續時間(1800,從評論推斷,1331386200 + 1800 = 1331388000)指定。
SO上有許多問題(包括確定兩個日期范圍是否重疊 )處理重疊時間段,但確定兩個句點(由[s1, e1]
和[e2, s2]
表示重疊 )的基本技術是否簡單:
if (s1 < e2 && s2 < e1)
...the intervals overlap...
如果需要,你可以和<
vs <=
玩雜耍。 當然,您可以根據需要為查詢添加額外的條件。
將它應用到您的示例中,您似乎應該編寫如下內容:
-- s1 == calTime
-- e1 == calTime + duration
-- s2 == 1331386200
-- e2 == 1331388000
SELECT *
FROM calendar_01
WHERE calTime < 1331388000 -- s1 < e2
AND 1331386200 < (calTime + duration) -- s2 < e1
AND agentID = 1 -- other criteria
ORDER BY calTime ASC
LIMIT 0 , 30
如果返回任何數據,則新數據與一個或多個現有數據行之間存在沖突(該語句將返回最多30個此類行的列表)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.