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

2つの時間が等しい場合(例: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そこにない場合、 36時間ではなく12時間になることをどのように確認できますか?

それでも、次の構成を使用できます。

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

ああ、それがそこにあることを知っていました。サブタイムはあなたが望むことをするかもしれませんか?

http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_subtime

追加するために編集:もう1つの除算が必要です。秒までの時間は秒を返し、60で1回割ると分になります。時間を取得するには、もう一度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 に答える