SQL日期间隔查询

时间:2011-05-26 11:48:41

标签: mysql sql date select

我正在管理一个事件数据库。每个事件都有一个开始和结束时间戳(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发生的事件时,不会出现此事件

3 个答案:

答案 0 :(得分:3)

如果我的问题正确,[: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

答案 1 :(得分:1)

如果您想查询“今天”(或其他某个日期)的所有事件,那些从过去或“今天”开始到“今天”或将来结束的事件您需要一些查询:

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)

答案 2 :(得分:0)

我认为您应该像这样修改查询:

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

哪里有param?是当前日期或当前时间戳。