簡體   English   中英

SQL 日期間隔查詢

[英]SQL date intervals query

我正在管理一個事件數據庫。 每個事件都有一個開始和結束時間戳( INT, unix timestamp )。

目前,我可以使用單個 SQL 查詢執行以下操作:

  • 建立一個日歷,並標記事件發生的日期
  • 列出給定日期發生的事件(YYYY/MM/DD、YYYY/MM)

問題是當一個事件跨越幾天時,我無法在它的開始和結束時間戳之間的日期列出它。

例如:

活動從 2011/05/25 開始,到 2011/05/27 結束,我無法在 2011/05/26 頁面上列出它。

我的實際 SQL 查詢是

SELECT * FROM `event` 
WHERE (`start` BETWEEN ? AND ?) OR (`end` BETWEEN ? AND ?) 
ORDER BY start ASC

兩個綁定參數(unix 時間戳)會根據給定的參數類型(整月或特定日期)自動計算

是否有可能在擴展我上面的查詢的兩個端點之間的一天內獲得這些事件(跨越幾天)?

如果我能澄清我的問題,請告訴我。

更新

例子:

event start: 1309125660 (2011-06-27 00:01:00)
end end: 1314050340 (2011-08-22 23:59:59)

select start: 1312408860 (2011-08-04 00:01:00)
select end: 1312495199 (2011-08-04 23:59:59)

當我嘗試列出 2011/08/4 發生的事件時,此事件不會出現

如果我的問題是正確的,並且[:start, :end]是您感興趣的日期范圍,那么您正在尋找:

select *
 from event
where -- event started earlier, ends later
      start <= :start and :start <= end
   or -- event starts during [:start, :end]
      :start <= start and start <= :end
   or -- event ends during [:start, :end]  
      :start <= end and end <= :end;

如果您正在尋找特定的:day ,請使用:day作為:start:day + 1 day作為:end

當您想查詢“今天”(或其他日期)的所有事件時,事件發生在過去或“今天”並結束“今天”或將來,您需要一些查詢,例如:

SELECT * FROM `event` WHERE 
   (`start` >= :start) AND (`end` <= :end) OR
   (`start` <= :end) AND (`end` >= :start)
ORDER BY start ASC

? 是你的實際日期。

Test data:

123456789
   nn     <-- :start, :end
 xx       1 
      xx  2 
  xx      3 s
    xx    4 s
  xxxx    5 s
   xx     6 s

Test query:

select * from event where 
(start >= 4 and end <= 5) or
(start <= 5 and end >= 4)

我認為您應該像這樣修改查詢:

SELECT * FROM `event` WHERE ? BETWEEN `start` AND `end` ORDER BY start ASC

參數在哪里? 是當前日期或當前時間戳。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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