Разбиение дат и времени с помощью строковых функций

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

Решение
Рассматривайте значение времени как строку и используйте такие функции, как LEFT() и MID(), для извлечения подстрок, соответствующих интересующей части значения.

Обсуждение
Если вы передаете строковой функции дату или время, то MySQL интерпретирует их как строку, то есть у вас появляется возможность извлечения подстрок. Поэтому для извлечения частей значений времени можно использовать такие строковые функции, как LEFT() и MID().

mysql> SELECT dt,
-> LEFT(dt,4) AS year,
-> MID(dt,9,2) AS day,
-> RIGHT(dt,2) AS second
-> FROM datetime_val;

+---------------------+------+------+--------+
| dt | year | day | second |
+---------------------+------+------+--------+
| 1970-01-01 00:00:00 | 1970 | 01 | 00 |
| 1987-03-05 12:30:15 | 1987 | 05 | 15 |
| 1999-12-31 09:00:00 | 1999 | 31 | 00 |
| 2000-06-04 15:45:30 | 2000 | 04 | 30 |
+---------------------+------+------+--------+

Вы можете выделить из значения DATETIME все составляющие времени или даты, используя функции извлечения строк LEFT() или RIGHT():

mysql> SELECT dt,
-> LEFT(dt,10) AS date,
-> RIGHT(dt,8) AS time
-> FROM datetime_val;


+---------------------+------------+----------+
| dt | date | time |
+---------------------+------------+----------+
| 1970-01-01 00:00:00 | 1970-01-01 | 00:00:00 |
| 1987-03-05 12:30:15 | 1987-03-05 | 12:30:15 |
| 1999-12-31 09:00:00 | 1999-12-31 | 09:00:00 |
| 2000-06-04 15:45:30 | 2000-06-04 | 15:45:30 |
+---------------------+------------+----------+

Аналогично можно обрабатывать и значения TIMESTAMP.


Однако поскольку они не содержат символов-разделителей, индексы для LEFT() или RIGHT() несколько отличаются (как и форматы вывода значений):

mysql> SELECT ts,
-> LEFT(ts,8) AS date,
-> RIGHT(ts,6) AS time
-> FROM timestamp_val;

+----------------+----------+--------+
| ts | date | time |
+----------------+----------+--------+
| 19700101000000 | 19700101 | 000000 |
| 19870305123015 | 19870305 | 123015 |
| 19991231090000 | 19991231 | 090000 |
| 20000604154530 | 20000604 | 154530 |
+----------------+----------+--------+

При использовании строковых функций для разбиения значений времени на составляющие необходимо помнить о двух ограничениях (которыми не связаны функции извлечения составляющих и форматирующие функции):

• Для того чтобы использовать такие функции, как LEFT(), MID() или RIGHT(), необходимо, чтобы строки имели фиксированную длину. MySQL может интерпретировать значение 1987-1-1 как 1987-01-01, если вы вставите его в столбец DATE. Но если для извлечения дня использовать функцию RIGHT('1987-1-1',2), то ничего не получится. Если значения содержат подстроки переменной длины, можно использовать SUBSTRING_INDEX().


Если значения близки к формату ISO, вы можете стандартизировать их, используя приемы.

• Строковые функции нельзя использовать для получения значений, которые не соответствуют подстроке значения даты, например дня недели или дня года.

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

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

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