0

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

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

4

3 回答 3

2

强烈建议避免仅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;
于 2012-06-25T19:16:57.770 回答
1

啊,知道它在那里。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
于 2012-06-25T18:21:53.300 回答
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

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

于 2012-06-25T19:28:00.580 回答