我们有一个如下所示的查询:
SELECT
hd.definition_id,
hd.sun_end < hd.sun_start AS sunEndFirst,
(IF (
hd.sun_end IS NULL,
0,
IF(
hd.sun_start IS NULL,
0,
IF(hd.sun_end = hd.sun_start, 24, time_to_sec(timediff(hd.sun_end, hd.sun_start)) / 60)
)
))
FROM audit_hour_definition AS hd
WHERE hd.definition_id = 5
ORDER BY hd.definition_id
当两次相等时(例如09:00:00-09:00:00),查询有效。当开始和结束时间在同一天(例如02:00:00-16:00:00)时,查询起作用。当开始和结束时间延伸到午夜标记时,查询会中断。例如,当我们想要12时,18:00:00-06:00:00返回-720。
有没有人有解决这个问题的好方法?
编辑:所有时间列都使用MySQL的TIME数据类型。
答案 0 :(得分:1)
强烈建议您在记录某些事件时避免仅使用TIME
。正是这种情况。这将是您案例的最佳解决方案,因为简单地更改类型将消除所有转换。
如果由于某些原因这是不可能的,那么你需要以某种方式构建时间戳,即你需要一个日期部分。如果它不在那里,那你怎么能确定18:00:00-06:00:00
产生12小时而不是36?
仍然可以使用以下构造:
SELECT
hd.definition_id,
hd.sun_end < hd.sun_start AS sunEndFirst,
IF(hd.sun_end IS NULL OR hd.sun_start IS NULL,
0,
IF(hd.sun_end = hd.sun_start, 24,
time_to_sec(timediff(
IF(hd.sun_end > hd.sun_start, hd.sun_end,
hd.sun_end + cast('24:00:00' as time)),
hd.sun_start)) / 60
)
)
FROM audit_hour_definition AS hd
WHERE hd.definition_id = 5
ORDER BY hd.definition_id;
答案 1 :(得分:0)
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_subtime
编辑补充:你还需要一个师。你的时间秒返回秒,一次除以60会给你几分钟。再分60来得到几个小时。
也许这可能有效?:
SELECT
hd.definition_id,
hd.sun_end < hd.sun_start AS sunEndFirst,
(IF (
hd.sun_end IS NULL,
0,
IF(
hd.sun_start IS NULL,
0,
IF(hd.sun_end = hd.sun_start, 24,
IF (hd.sun_end > hd.sun_start, time_to_sec(timediff(hd.sun_end, hd.sun_start)) / 3600), time_to_sec(timediff(hd.sun_start, hd.sun_end))/3600))
)
))
FROM audit_hour_definition AS hd
WHERE hd.definition_id = 5
ORDER BY hd.definition_id
答案 2 :(得分:0)
根据@vyegorov的一些见解,我得出了以下问题。
SELECT hd.definition_id, IF(
hd.sun_end IS NULL OR hd.sun_start IS NULL,
0,
IF(
hd.sun_end = hd.sun_start,
24,
IF(
hd.sun_end < hd.sun_start,
24 + (time_to_sec(timediff(
hd.sun_end,
hd.sun_start
)) / 3600),
time_to_sec(timediff(
hd.sun_end,
hd.sun_start
)) / 3600
)
))
FROM audit_hour_definition AS hd
此查询将返回给定工作日的正确小时数。