簡體   English   中英

選擇行的SQL語句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM