1

我被代码困住了。我想查看来自 MySQL 数据库的女巫事件是在输入事件之前、之后和期间。

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

  • Event_id(int AUTO_INCREMENT)
  • start_date(日期)
  • start_time(varchar)
  • end_date(日期)
  • end_time(varchar)

开始时间和结束时间为 24 小时制,存储时不带冒号分隔符:(所以 23:50 存储为 2350,1:00 存储为 0100)

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

如何进行查询(或脚本)以获取最接近输入事件的事件、检查在输入事件期间是否存在事件的查询以及在输入事件之后获取最接近事件的查询?

4

3 回答 3

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

这将为您提供正在进行的事件。

在进行比较之前,您可能需要将TIMEDIFFs包装起来。SECONDS()

于 2012-06-13T12:44:23.883 回答
0

要实现这一点,您确实需要将 DATE + VARCHAR 字段转换为更合适的内容,例如 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:我没有测试它,但这个想法是正确的,你可能需要适应它。

祝你好运

于 2012-06-13T12:45:13.033 回答
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 以及 '<' for '>' 后获得最接近的值

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

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]))
于 2012-06-13T12:45:57.743 回答