13.2.8 Преобразование между типами дат и времени
В некоторой степени вы можете преобразовать значение из одного временного типа в другой. Однако могут произойти некоторые изменения значения или потеря информации. Во всех случаях преобразование между временными типами подчиняется диапазону допустимых значений для результирующего типа. Например, хотя значения 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.