Разбиение интервалов времени на составляющие

Задача
У вас есть интервал времени, представленный как значение времени, но вам хотелось бы разбить его на составляющие.

Решение
Для разбиения интервала на составляющие используйте функции HOUR(), MINUTE() и SECOND(). Если в SQL вычисление получается сложным, а интервал используется в программе, возможно, будет проще выполнить аналогичные вычисления на вашем языке программирования.

Обсуждение
Чтобы представить интервал времени в терминах составляющих его часов, минут и секунд, вычислите компоненты интервала в SQL с помощью функций HOUR(), MINUTE() и SECOND() (не забывайте о том, что интервалы могут быть отрицательными, и это необходимо учитывать). Например, чтобы определить составляющие интервалов между столбцами t1 и t2 таблицы time_val, можно было бы выполнить такое предложение SQL:

mysql> SELECT t1, t2,
-> SEC_TO_TIME(TIME_TO_SEC(t2) - TIME_TO_SEC(t1)) AS 'interval as TIME',
-> IF(SEC_TO_TIME(TIME_TO_SEC(t2) >= TIME_TO_SEC(t1)),'+','-') AS sign,
-> HOUR(SEC_TO_TIME(TIME_TO_SEC(t2) - TIME_TO_SEC(t1))) AS hour,
-> MINUTE(SEC_TO_TIME(TIME_TO_SEC(t2) - TIME_TO_SEC(t1))) AS minute,
-> SECOND(SEC_TO_TIME(TIME_TO_SEC(t2) - TIME_TO_SEC(t1))) AS second
-> FROM time_val;

+----------+----------+------------------+------+------+--------+--------+
| t1 | t2 | interval as TIME | sign | hour | minute | second |
+----------+----------+------------------+------+------+--------+--------+
| 15:00:00 | 15:00:00 | 00:00:00 | + | 0 | 0 | 0 |
| 05:01:30 | 02:30:20 | -02:31:10 | - | 2 | 31 | 10 |
| 12:30:20 | 17:30:45 | 05:00:25 | + | 5 | 0 | 25 |
+----------+----------+------------------+------+------+--------+--------+

Выглядит беспорядочно и запутанно, а если попытаться сделать то же самое, используя операцию деления по модулю, получится еще хуже.


Если запрос вычисления интервала выполняется из программы, всего этого беспорядка можно избежать. Используйте SQL только для вычисления интервалов в секундах, затем используйте язык API для разбиения каждого интервала на составляющие. Необходимо учитывать возможность отрицательного значения и выводить целое значение для каждого компонента. Рассмотрим функцию time_components(), написанную на языке Python, которая принимает значение интервала в секундах и возвращает четырехэлементный кортеж, содержащий знак, а также часы, минуты и секунды:

def time_components (time_in_secs):
if time_in_secs < 0:
sign = "-"
time_in_secs = -time_in_secs
else:
sign = ""
hours = int (time_in_secs / 3600)
minutes = int ((time_in_secs / 60)) % 60
seconds = time_in_secs % 60
return (sign, hours, minutes, seconds)

Можно использовать функцию time_components() в программе так:

query = "SELECT t1, t2, TIME_TO_SEC(t2) - TIME_TO_SEC(t1) FROM time_val"
cursor = conn.cursor ()
cursor.execute (query)
for (t1, t2, interval) in cursor.fetchall ():
(sign, hours, minutes, seconds) = time_components (interval)
print "t1 = %s, t2 = %s, interval = %s%d h, %d m, %d s" \
% (t1, t2, sign, hours, minutes, seconds)
cursor.close ()

Эта программа формирует такой вывод:

t1 = 15:00:00, t2 = 15:00:00, interval = 0 h, 0 m, 0 s
t1 = 05:01:30, t2 = 02:30:20, interval = -2 h, 31 m, 10 s
t1 = 12:30:20, t2 = 17:30:45, interval = 5 h, 0 m, 25 s

Предыдущий пример является иллюстрацией общей идеи, которая часто полезна при создании запросов в программе: может оказаться, что проще не связываться со сложными вычислениями в SQL, а лишь выполнить простой запрос, а затем обрабатывать его результаты, используя средства языка API..



Оцените статью: (0 голосов)
0 5 0

Статьи из раздела MySQL на эту тему:
Выбор записей по временным характеристикам
Вывод значений TIMESTAMP в удобном для чтения виде
Вычисление возраста
Вычисление длины месяца
Вычисление интервалов между значениями времени

Вернуться в раздел: MySQL / 5. Работа с датами и временем