MySQL / 5. Работа с датами и временем

Обработка даты и времени как чисел

Задача
Вы хотите работать с временной строкой как с числом.

Решение
Преобразуйте строку в число.

Обсуждение
MySQL часто разрешает обрабатывать значения даты и времени как числа. Это может быть удобно для выполнения арифметических операций со значениями. Чтобы вызвать преобразование значения времени в число, добавьте к нему ноль или используйте его в числовом контексте:

mysql> SELECT t1,
-> t1+0 AS 't1 as number',
-> FLOOR(t1) AS 't1 as number',
-> FLOOR(t1/10000) AS 'hour part'
-> FROM time_val;

+-----------+----------------+----------------+------------+
|         t1    | t1 as number | t1 as number | hour part |
+-----------+----------------+----------------+------------+
| 15:00:00 |      150000     |       150000    |        15     |
| 05:01:30 |        50130     |         50130    |          5     |
| 12:30:20 |      123020     |       123020    |        12     |
+-----------+----------------+----------------+------------+

Такое же преобразование можно выполнить и для даты или значения дата-и-время:

mysql> SELECT d, d+0 FROM date_val;

+--------------+-------------+
|            d       |       d+0     |
+--------------+-------------+
| 1864-02-28 | 18640228 |
| 1900-01-15 | 19000115 |
| 1987-03-05 | 19870305 |
| 1999-12-31 | 19991231 |
| 2000-06-04 | 20000604 |
+--------------+-------------+

mysql> SELECT dt, dt+0 FROM datetime_val;

+--------------------------+---------------------+
|                  dt               |              dt+0        |
+--------------------------+---------------------+
| 1970-01-01 00:00:00 | 19700101000000 |
| 1987-03-05 12:30:15 | 19870305123015 |
| 1999-12-31 09:00:00 | 19991231090000 |
| 2000-06-04 15:45:30 | 20000604154530 |
+--------------------------+---------------------+

Значение, порожденное добавлением нуля, – это не то же самое, что значение, полученное в результате преобразования в базовые единицы, такие как секунды или дни. При добавлении ноля вы по сути удаляете разделители из строкового представления исходного значения. Кроме того, преобразование в число возможно только для значений, которые MySQL воспринимает как значения времени. Если вы попытаетесь преобразовать в число литерную строку, добавляя к ней 0, то получите только первую часть значения:

mysql> SELECT '1999-01-01'+0, '1999-01-01 12:30:45'+0, '12:30:45'+0;

+-------------------+------------------------------+----------------+
| '1999-01-01'+0 | '1999-01-01 12:30:45'+0 | '12:30:45'+0 |
+-------------------+------------------------------+----------------+
|           1999        |                 1999                 |           12       |
+-------------------+------------------------------+----------------+

То же самое случится и при использовании функций DATE_FORMAT() и TIME_FORMAT(), при извлечении частей значений DATETIME или TIMESTAMP посредством функций LEFT() или RIGHT(). В контексте прибавления 0 результаты этих функций рассматриваются как строки, а не как значения времени.

Статьи по MySQL на эту тему:

Выбор записей по временным характеристикам
Вывод значений TIMESTAMP в удобном для чтения виде
Вычисления со значениями TIMESTAMP Задача
Использование значений TIMESTAMP
Обработка в MySQL строк как значений времени

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