завдання
Ви хочете додати час до значення дати або до значення дата-і-час.
Рішення
Використовуйте функції 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 рік).