检查事件是否在其他事件之前,之后或期间

时间:2012-06-13 12:26:11

标签: php mysql date time

我坚持使用代码。我想在输入事件之前,之后和期间看到来自MySQL数据库的女巫事件。

我有一个包含以下字段的表:

  • Event_id(int AUTO_INCREMENT)
  • start_date(约会)
  • start_time(varchar)
  • end_date(约会)
  • end_time(varchar)

开始时间和结束时间是24小时时间格式,并且没有冒号分隔符:存储(因此23:50将存储为2350,1:00将存储为0100)< / p>

输入事件的日期和时间将采用相同的格式。

如何创建获取与输入事件最接近的事件的查询(或脚本),检查输入事件期间是否存在事件的查询以及在输入事件之后获得事件最近的查询?

3 个答案:

答案 0 :(得分:1)

首先,通过更改您的方案开始,所以你改为

event_id (int AUTO_INCREMENT),
start_date (timestamp), 
end_date (timestamp)

对于您的查询,您现在可以使用TIMEDIFF

最近的活动

SELECT *, TIMEDIFF(input_date, start_date) diff
FROM events ORDER BY diff LIMIT 1

这将为您带来下一个活动。

活动期间的活动

SELECT * FROM events
WHERE
  TIMEDIFF(input_date, start_date) > 0 AND
  TIMEDIFF(input_date, end_date) < 0
FROM events

这将为您提供正在进行的活动。

在进行比较之前,您可能需要将TIMEDIFF包裹在SECONDS()中。

答案 1 :(得分:0)

要实现这一点,您确实需要将DATE + VARCHAR字段转换为更合适的字段,例如DATETIME(我更喜欢datetime,查询时更易读,内部时间戳更快)

然后,在将4个字段合并为2个字段后,您可以使用两种类型的查询:

SELECT
    CASE 
        WHEN startDateTime <= "targetDate" AND endDateTime > "targetDate" THEN "while"
        WHEN startDateTime > "targetDate" THEN "before"
        WHEN endDateTime <= "targetDate" THEN "after"
    END AS timeframe,
    events.*
FROM
    events

或者您也可以使用工会,两者都会产生类似的结果,选择您喜欢的结果:

SELECT "before" AS timeframe, events.* FROM events
WHERE startDateTime > "targetDate"
UNION
SELECT "while" AS timeframe, events.* FROM events
WHERE startDateTime <= "targetDate" AND endDateTime > "targetDate"
UNION
SELECT "after" AS timeframe, events.* FROM events
WHERE endDateTime <= "targetDate"

PS:我没有测试过,但想法是正确的,你可能需要调整它。

祝你好运

答案 2 :(得分:0)

之前最近:

Select * from Event_table where start_date<=[imputed start_date] and start_time<[imputed start_time] order by start_date DESC, start_time DESC LIMIT 1

此sql获取推算事件之前的事件列表,按天后代排序,以及开始时间后代使第一个结果最接近,LIMIT 1仅恢复1条记录,获得最接近的记录。

也许您更喜欢使用end_date和end_time(而不是start_date和开始时间)来获取最接近事件的结尾。

为了获得最接近的更改[imputed start_date]和[imputed start_time]到end_date和end_time以及'&lt;'对于'&gt;'

要获取插补事件期间的事件数,请使用以下之间的简单查询:

Select count(event_id) from event_table where ( start_date between ([imputed start_date] and [imputed end_date]) or end_date between ([imputed start_date] and [imputed end_date]) ) AND (start_time between ([imputed start_time] and [imputed end_time]) OR (end_time between ([imputed start_time] and [imputed end_time]))