MySQL中不同日期的两次差异

时间:2012-06-25 18:15:28

标签: mysql time

我们有一个如下所示的查询:

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数据类型。

3 个答案:

答案 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)

啊,知道它在那里。 subtime可能会做你想要的吗?

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

此查询将返回给定工作日的正确小时数。