Получение одной даты из другой заменой подстроки

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

Решение
Рассматривая значение даты или времени как строку, выполните непосредственную подстановку частей строки.

Обсуждение
В некоторых ситуациях для вычисления даты можно не выполнять никакие арифметические операции, а просто произвести замену подстрок. Например, вы можете применять строковые операции для вывода первого дня месяца, к которому относится дата, заменив составляющую дней на значение 01.

Используйте функцию DATE_FORMAT() или CONCAT():

mysql> SELECT d,
-> DATE_FORMAT(d,'%Y-%m-01') AS method1,
-> CONCAT(YEAR(d),'-',LPAD(MONTH(d),2,'0'),'-01') AS method2
-> FROM date_val;

+--------------+--------------+---------------+
| d | method1 | method2 |
+------------+------------+------------+
| 1864-02-28 | 1864-02-01 | 1864-02-01 |
| 1900-01-15 | 1900-01-01 | 1900-01-01 |
| 1987-03-05 | 1987-03-01 | 1987-03-01 |
| 1999-12-31 | 1999-12-01 | 1999-12-01 |
| 2000-06-04 | 2000-06-01 | 2000-06-01 |
+--------------+---------------+--------------+

Подстановку строк можно использовать и для получения фиксированной даты календарного года.


Чтобы получить день Нового года (1 января), замените месяц и день на 01:

mysql> SELECT d,
-> DATE_FORMAT(d,'%Y-01-01') AS method1,
-> CONCAT(YEAR(d),'-01-01') AS method2
-> FROM date_val;

+--------------+---------------+--------------+
| d | method1 | method2 |
+------------+------------+------------+
| 1864-02-28 | 1864-01-01 | 1864-01-01 |
| 1900-01-15 | 1900-01-01 | 1900-01-01 |
| 1987-03-05 | 1987-01-01 | 1987-01-01 |
| 1999-12-31 | 1999-01-01 | 1999-01-01 |
| 2000-06-04 | 2000-01-01 | 2000-01-01 |
+--------------+---------------+--------------+

Чтобы вывести дату Рождества, замените месяц и день значениями 12 и 25 соответственно:

mysql> SELECT d,
-> DATE_FORMAT(d,'%Y-12-25') AS method1,
-> CONCAT(YEAR(d),'-12-25') AS method2
-> FROM date_val;

+--------------+--------------+---------------+
| d | method1 | method2 |
+--------------+--------------+---------------+
| 1864-02-28 | 1864-12-25 | 1864-12-25 |
| 1900-01-15 | 1900-12-25 | 1900-12-25 |
| 1987-03-05 | 1987-12-25 | 1987-12-25 |
| 1999-12-31 | 1999-12-25 | 1999-12-25 |
| 2000-06-04 | 2000-12-25 | 2000-12-25 |
+--------------+--------------+---------------+

Чтобы выполнить операцию нахождения даты Рождества для других лет, используйте замену строк в сочетании со сдвигом даты.


Следующий запрос иллюстрирует две возможности вычисления даты Рождества два года спустя по отношению к сегодняшней дате. Первый способ: сначала находим Рождество текущего года, затем сдвигаем дату на 2 года вперед. Второй способ: смещаем на 2 года текущую дату, затем находим Рождество полученного года:

mysql> SELECT CURDATE(),
-> DATE_ADD(DATE_FORMAT(CURDATE(),'%Y-12-25'),INTERVAL 2 YEAR)
-> AS method1,
-> DATE_FORMAT(DATE_ADD(CURDATE(),INTERVAL 2 YEAR),'%Y-12-25')
-> AS method2;

+--------------+--------------+---------------+
| CURDATE() | method1 | method2 |
+--------------+------------+-----------------+
| 2002-07-15 | 2004-12-25 | 2004-12-25 |
+--------------+---------------+--------------+

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

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

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