11.2.9 Преобразование между типами даты и времени
В некоторой степени вы можете преобразовать значение из одного временного типа в другой. Однако может быть некоторое изменение значения или потеря информации. Во всех случаях преобразование между временными типами подчиняется диапазону допустимых значений для результирующего типа. Например, хотя DATE, DATETIME и TIMESTAMP значения могут быть указаны с использованием одного набора форматов, типы не имеют одинакового диапазона значений. TIMESTAMP значения не могут быть раньше 1970 UTC или позже '2038-01-19 03:14:07' UTC. Это означает, что дата, например, '1968-01-01', хотя и является допустимой как значение DATE или DATETIME, не является допустимой как значение TIMESTAMP и преобразуется в 0.
Преобразование значений DATE:
Преобразование значений DATETIME и TIMESTAMP:
Преобразование в значение
DATEучитывает дробные секунды и округляет часть времени. Например,'1999-12-31 23:59:59.499'становится'1999-12-31', а'1999-12-31 23:59:59.500'становится'2000-01-01'.Преобразование в значение
TIMEотбрасывает часть даты, так как типTIMEне содержит информации о дате.
Для преобразования значений TIME в другие временные типы используется значение CURRENT_DATE() для части даты. Значение TIME интерпретируется как прошедшее время (не время суток) и добавляется к дате. Это означает, что часть даты результата отличается от текущей даты, если значение времени находится вне диапазона от '00:00:00' до '23:59:59'.
Предположим, что текущая дата — '2012-01-01'. Значения TIME '12:00:00', '24:00:00' и '-12:00:00' при преобразовании в значения DATETIME или TIMESTAMP дают в результате '2012-01-01 12:00:00', '2012-01-02
00:00:00' и '2011-12-31
12:00:00' соответственно.
Преобразование TIME в DATE аналогично, но отбрасывает часть времени из результата: '2012-01-01', '2012-01-02' и '2011-12-31' соответственно.
Явное преобразование может использоваться для переопределения неявного преобразования. Например, при сравнении значений DATE и DATETIME, значение DATE приводится к типу DATETIME путем добавления части времени '00:00:00'. Чтобы выполнить сравнение, игнорируя часть времени значения DATETIME вместо этого, используйте функцию CAST() следующим образом:
date_col = CAST(datetime_col AS DATE)
Преобразование значений TIME и DATETIME в числовой вид (например, путем добавления +0) зависит от того, содержит ли значение дробную часть секунд. TIME( или N)DATETIME( преобразуется в целое число, когда N)N равно 0 (или опущено), и в значение с DECIMAL десятичными разрядами, когда N больше 0:
mysql> SELECT CURTIME(), CURTIME()+0, CURTIME(3)+0;
+-----------+-------------+--------------+
| CURTIME() | CURTIME()+0 | CURTIME(3)+0 |
+-----------+-------------+--------------+
| 09:28:00 | 92800 | 92800.887 |
+-----------+-------------+--------------+
mysql> SELECT NOW(), NOW()+0, NOW(3)+0;
+---------------------+----------------+--------------------+
| NOW() | NOW()+0 | NOW(3)+0 |
+---------------------+----------------+--------------------+
| 2012-08-15 09:28:00 | 20120815092800 | 20120815092800.889 |
+---------------------+----------------+--------------------+
© 2025 Oracle
Licensed under the GPLv2 License.