Преобразование дат в дни и обратно

Задача
У вас есть дата, а хотелось бы получить значение в днях, или наоборот.

Решение
Значения DATE можно преобразовывать в дни и получать из них при помощи функций TO_DAYS() и FROM_DAYS(). Значения дата-и-время также можно преобразовывать в дни, если вас не пугает потеря составляющей времени.

Обсуждение
Функция TO_DAYS() преобразует дату в соответствующее количество дней, а FROM_DAYS() выполняет обратную операцию:

mysql> SELECT d,
-> TO_DAYS(d) AS 'DATE to days',
-> FROM_DAYS(TO_DAYS(d)) AS 'DATE to days to DATE'
-> FROM date_val;

+------------+--------------+----------------------+
| d | DATE to days | DATE to days to DATE |
+------------+--------------+----------------------+| 1864-02-28 | 680870 | 1864-02-28 |
| 1900-01-15 | 693975 | 1900-01-15 |
| 1987-03-05 | 725800 | 1987-03-05 |
| 1999-12-31 | 730484 | 1999-12-31 |
| 2000-06-04 | 730640 | 2000-06-04 |
+------------+--------------+----------------------+

Если вы используете TO_DAYS(), следует прислушаться к рекомендации руководства по MySQL и избегать значений DATE, предшествующих началу летоисчисления по григорианскому календарю (1582).


Изменения длин календарных годов и месяцев, имевшие место до этой даты, вызывают сложности с объяснением того, что такое «день 0». Что же касается TIME_TO_SEC(), в данном случае соответствие значения TIME результирующему значению в секундах является очевидным и имеет осмысленную контрольную точку в 0 секунд.

Если вы передаете функции TO_DAYS() значение дата-и-время, то время отбрасывается, и извлекается дата. Этот способ можно применять для извлечения дат из значений типа DATETIME и TIMESTAMP:

mysql> SELECT dt,
-> TO_DAYS(dt) AS 'date part in days',
-> FROM_DAYS(TO_DAYS(dt)) AS 'date part as DATE'
-> FROM datetime_val;

+---------------------+-------------------+-------------------+
| dt | date part in days | date part as DATE |
+---------------------+-------------------+-------------------+
| 1970-01-01 00:00:00 | 719528 | 1970-01-01 |
| 1987-03-05 12:30:15 | 725800 | 1987-03-05 |
| 1999-12-31 09:00:00 | 730484 | 1999-12-31 |
| 2000-06-04 15:45:30 | 730640 | 2000-06-04 |
+---------------------+-------------------+-------------------+

mysql> SELECT ts,
-> TO_DAYS(ts) AS 'date part in days',
-> FROM_DAYS(TO_DAYS(ts)) AS 'date part as DATE'
-> FROM timestamp_val;

+----------------+-------------------+-------------------+
| ts | date part in days | date part as DATE |
+----------------+-------------------+-------------------+
| 19700101000000 | 719528 | 1970-01-01 |
| 19870305123015 | 725800 | 1987-03-05 |
| 19991231090000 | 730484 | 1999-12-31 |
| 20000604154530 | 730640 | 2000-06-04 |
+----------------+-------------------+-------------------+.



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

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

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