Разница во времени без учета времени между 0:00 ~ 4:00. MySQL - PullRequest
0 голосов
/ 17 июня 2020

MySQL версия 8.0

Я хочу рассчитать разницу во времени между двумя столбцами datetime. И получите строки, где duration> = 12: 00: 00.

, что я обычно делал бы:

select id
     , start_time
     , end_time
     , timediff(end_time, start_time) as duration
  from table;

, что я бы получил примерно так:

    id    start_time               end_time              duration
0   1   2020-06-01 01:00:00   2020-06-01 14:00:00        13:00:00
1   2   2020-06-01 01:00:00   2020-06-01 18:00:00        17:00:00
2   3   2020-06-01 19:00:00   2020-06-02 10:00:00        15:00:00
3   4   2020-06-02 04:00:00   2020-06-02 16:00:00        12:00:00

Для столбца продолжительности я не хочу, чтобы время между 00:00:00 ~ 04:00:00 добавлялось к продолжительности.
Итак, для первой строки длительность = 10:00:00 с 01:00:00 ~ 14: 00: 00 = 10:00:00, игнорируя время между 00:00:00 ~ 04: 00: 00

то же самое для второй строки, мы вычитаем 3 часа из продолжительности.

так что мой желаемый результат будет:

    id    start_time               end_time              duration
0   1   2020-06-01 01:00:00   2020-06-01 14:00:00        10:00:00
1   2   2020-06-01 01:00:00   2020-06-01 18:00:00        14:00:00
2   3   2020-06-01 19:00:00   2020-06-02 10:00:00        11:00:00
3   4   2020-06-02 04:00:00   2020-06-02 16:00:00        12:00:00

Есть много строк, где время также включает минуты и секунды.

Заранее спасибо!

Я взял все строки, где duration> = 12: 00: 00.

Затем данные разделены на 4 региона в зависимости от их start_time.

a_region = 00 ~ 04
b_region = 04 ~ 12
c_region = 12 ~ 16
d_region = 16 ~ 24

Для a_region я вычел 04:00:00 - start_time, которое является временем, которое мы должны компенсировать продолжительности в a_region.

compatio n = 04:00:00 - начальное_время
компенсированное_время = длительность - компенсация.

Для b_region компенсация не требуется, если прошло 00 ~ 04, это означает, что продолжительность уже прошла = 12:00:00.

Для c_region,
компенсация = 16:00:00 - время начала
компенсированное_время = продолжительность - компенсация

Для d_region, поскольку мы получили длительность> = 12:00:00

он передаст все 00 ~ 04, поэтому компенсированное_время = продолжительность - 04: 00: 00.

Я решил это с помощью Python, но выше это logi c, который я использовал .

1 Ответ

0 голосов
/ 17 июня 2020

Один вариант использует greatest():

select id
     , start_time
     , end_time
     , timediff(
        greatest(, 
            end_time,
            date_format(end_time,  '%Y-%m-%d 04:00:00')
        ),
        greatest(
            start_time, 
            date_format(start_time, '%Y-%m-%d 04:00:00')
        ) 
    ) as duration
from table;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...