DATE_SUB ()
DATE_ADD(date,INTERVAL expr type)
DATE_SUB(date,INTERVAL expr type)
ADDDATE(date,INTERVAL expr type)
SUBDATE(date,INTERVAL expr type)
Дані функції роблять арифметичні дії над датами. Аргумент date
є величиною типу DATETIME
або DATE
, що задає початкову дату. Вираз expr
задає величину інтервалу, який слід додати до початкової дати або відняти з початкової дати. Вираз expr
є рядок, який може починатися з -
для негативних значень інтервалів. Ключове слово type
показує, яким чином необхідно інтерпретувати даний вираз. Допоміжна функція EXTRACT(type FROM date)
повертає інтервал зазначеного типу (type
) зі значення дати. У наступній таблиці показаний взаємозв'язок аргументів type
і expr
:
Значення |
Очікуваний формат |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
В Mysql формат виразу expr
допускає будь-які розділові знаки. Роздільники, представлені в даній таблиці, наведені в якості прикладів. Якщо аргумент date є
величиною типу DATE
і передбачувані обчислення містять у собі тільки частини YEAR
, MONTH
, і DAY
( тобто не містять тимчасової частини TIME
), то результат представляється величиною типу DATE
. В інших випадках результат являє собою величину DATETIME
:
SELECT DATE_ADD("1997-12-31 23:59:59", INTERVAL 1 SECOND);-> 1998-01-01 00:00:00
SELECT DATE_ADD("1997-12-31 23:59:59", INTERVAL 1 DAY);-> 1998-01-01 23:59:59
SELECT DATE_ADD("1997-12-31 23:59:59", INTERVAL "1:1" MINUTE_SECOND);
-> 1998-01-01 00:01:00
SELECT DATE_SUB("1998-01-01 00:00:00", INTERVAL "1 1:1:1" DAY_SECOND);
-> 1997-12-30 22:58:59
SELECT DATE_ADD("1998-01-01 00:00:00", INTERVAL "-1 10" DAY_HOUR);
-> 1997-12-30 14:00:00
SELECT DATE_SUB("1998-01-02", INTERVAL 31 DAY); -> 1997-12-02
Якщо зазначений інтервал занадто короткий ( тобто не включає всі частини інтервалу, очікувані при заданому ключовому слові type
), то Mysql припускає, що опущені крайні ліворуч частини інтервалу. Наприклад, якщо зазначений аргумент type
у вигляді DAY_SECOND
, теобто очікуваний вираз expr
повинен мати наступні частини: дні, години, хвилини й секунди. Якщо в цьому випадку вказати значення інтервалу у вигляді "1:10"
, то Mysql припускає, що опущені дні і години, а дана величина включає тільки хвилини й секунди. Інакше кажучи, комбінація "1:10" DAY_SECOND
інтерпретується як еквівалент "1:10" MINUTE_SECOND
. Аналогічним чином в Mysql інтерпретуються й значення TIME. Будьте пильними так як тип може з
DATE перевестися в DATETIME.
SELECT DATE_ADD("1999-01-01", INTERVAL 1 DAY); -> 1999-01-02
SELECT DATE_ADD("1999-01-01", INTERVAL 1 HOUR); -> 1999-01-01 01:00:00
При використанні некоректних значень дат результат буде рівний NULL
. Якщо при підсумовуванні MONTH
, YEAR_MONTH
або YEAR
номер дня в результуючій даті перевищує максимальну кількість днів у новому місяці, то номер дня результуючої дати буде рівним останньому дню нового місяця:
SELECT DATE_ADD('1998-01-30', INTERVAL 1 MONTH); -> 1998-02-28