Додавання значення часу до дати

завдання
Ви хочете додати час до значення дати або до значення дата-і-час.

Рішення
Використовуйте функції DATE_ADD () і DATE_SUB (), спеціально призначені для виконання арифметичних операцій з датами. Ви також можете застосовувати TO_DAYS () і FROM_DAYS () або UNIX_TIMESTAMP () і FROM_UNIXTIME ().

Обговорення
Арифметичні операції з датами трохи складніше, ніж з часом, через змінної довжини місяців і років. Тому MySQL пропонує спеціальні функції DATE_ADD () і DATE_SUB () для складання інтервалів з датами і вирахування з ніх.1 Функції приймають значення дати d і інтервал в такому форматі:

DATE_ADD (d, INTERVAL значення одиниця)
DATE_SUB (d, INTERVAL значення одиниця)

де одиниця - це одиниця виміру інтервалу, а значення - вираз, що визначає кількість таких одиниць. До найбільш розповсюджених відносяться такі специфікатори одиниць, як YEAR, MONTH, DAY, HOUR, MINUTE і SECOND (повний список наведено в посібнику з MySQL). Зверніть увагу на те, що одиниця вимірювання вказується не в множині, а в однині.

За допомогою функцій DATE_ADD () і DATE_SUB () можна виконувати такі арифметичні операції:

• Визначити дату, яка настане через три дні після сьогоднішньої:

mysql> SELECT CURDATE (), DATE_ADD (CURDATE (), INTERVAL 3 DAY);

• з'ясувати дати, що настала тиждень тому (для подання тижневого інтервалу запит використовує значення 7 DAY, так як не існує одиниця виміру WEEK): mysql> SELECT CURDATE (), DATE_SUB (CURDATE (), INTERVAL 7 DAY);

• Якщо вам необхідно дізнатися і дату, і час, почніть зі значення DATETIME або TIMESTAMP.


Щоб відповісти на питання: «Скільки часу буде через 60 годин?», Виконайте такий запит:

mysql> SELECT NOW (), DATE_ADD (NOW (), INTERVAL 60 HOUR);

• Деякі специфікатор інтервалів включають і дату, і час. Наступний запит додає до поточних дату і час чотирнадцять з половиною годин:

mysql> SELECT NOW (), DATE_ADD (NOW (), INTERVAL '14: 30 'HOUR_MINUTE);

Аналогічно можна додати 3 дні і 4 години:

mysql> SELECT NOW (), DATE_ADD (NOW (), INTERVAL '3 4' DAY_HOUR);

Функції DATE_ADD () і DATE_SUB () є взаємозамінними, так як одна з них - той же, що інша з інтервалом протилежного знака.


Наприклад, два такі виклику еквіваленти для будь-якого значення дати d:

DATE_ADD (d, INTERVAL -3 MONTH)
DATE_SUB (d, INTERVAL 3 MONTH)

Починаючи з MySQL 3.23.4, можна використовувати для додавання і віднімання інтервалів дат оператори + і -:

mysql> SELECT CURDATE (), CURDATE () + INTERVAL 1 YEAR;

mysql> SELECT NOW (), NOW () - INTERVAL 24 HOUR;

Для додавання інтервалів до дати або значенням дата-і-час можна також використовувати функції перетворення в базові одиниці і назад. Наприклад, щоб перенести дату вперед або назад на тиждень (сім днів), використовуйте функції TO_DAYS () і FROM_DAYS ():

Функція TO_DAYS () вміє до того ж перетворювати значення DATETIME і TIMESTAMP в дні, що зручно для тих, кому не потрібна частина часу:

Для забезпечення точності роботи зі значеннями DATETIME і TIMESTAMP використовуйте функції UNIX_TIMESTAMP () і FROM_UNIXTIME () замість розглянутих раніше.


Змінимо значення DATETIME на годину (3600 секунд) вперед і назад:

Для реалізації останнього прийому необхідно, щоб і вихідне, і результуюче значення потрапляли в дозволений для значень TIMESTAMP діапазон (з 1970 року десь по 2037 рік).