我正在管理一个事件数据库。每个事件都有一个开始和结束时间戳(INT, unix timestamp
)。
目前,我可以使用单个SQL查询执行以下操作:
问题是当一个事件跨越几天时,我无法在它的开始和结束时间戳之间的日期列出它。
例如:
活动于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发生的事件时,不会出现此事件
答案 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?是当前日期或当前时间戳。