小编典典

SQL日期间隔查询

sql

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


阅读 417

收藏
2021-04-14

共1个答案

小编典典

如果我提出的问题正确,并且[: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,请使用:dayas:start:day + 1 dayas :end

2021-04-14