Лекція 9. Семестр 1. Функції в mySQL (Частина 3)
Функції дати та часу
DAYOFWEEK(date)
Повертає індекс дня тижня для аргумента date (1 = неділя, 2 =понеділок, ... 7 = субота). Ці індексні величини відповідають стандарту ODBC:
SELECT DAYOFWEEK('1998-02-03'); -> 3
WEEKDAY(date)
Повертає індекс дня тижня для аргумента date (0 =понеділок, 1 = вівторок, ... 6 = неділя):
SELECT WEEKDAY('1997-10-04 22:23:00'); -> 5
DAYOFMONTH(date)
Повертає порядковий номер дня місяця для аргумента date у діапазоні від 1 до 31:
SELECT DAYOFMONTH('1998-02-03'); -> 3
DAYOFYEAR(date)
Повертає порядковий номер дня року для аргумента date у діапазоні від 1 до 366:
SELECT DAYOFYEAR('1998-02-03'); -> 34
MONTH(date)
Повертає порядковий номер місяця в році для аргумента date у діапазоні від 1 до 12:
SELECT MONTH('1998-02-03'); -> 2
DAYNAME(date)
Повертає назву дня тижня для аргумента date:
SELECT DAYNAME("1998-02-05"); -> 'Thursday'
MONTHNAME(date)
Повертає назву місяця для аргумента date:
SELECT MONTHNAME("1998-02-05"); -> 'February'
QUARTER(date)
Повертає номер кварталу року для аргумента date у діапазоні від 1 до 4:
SELECT QUARTER('98-04-01'); -> 2
WEEK(date)
WEEK(date,first)
При наявності одного аргументу повертає порядковий номер тижня в році для date у діапазоні від 0 до 53 ( так, можливо початок 53-го тижня) для регіонів, де неділя вважається першим днем тижня. Форма WEEK() із двома аргументами дозволяє уточнити, з якого дня починається тиждень - з неділі або з понеділка. Тиждень починається з неділі, якщо другий аргумент рівний 0, і з понеділка - якщо 1:
SELECT WEEK('1998-02-20'); -> 7
SELECT WEEK('1998-02-20',1); -> 8
YEAR(date)
Повертає рік для аргумента date у діапазоні від 1000 до 9999:
SELECT YEAR('98-02-03'); -> 1998
HOUR(time)
Повертає годину для аргумента time у діапазоні від 0 до 23:
SELECT HOUR('10:05:03'); -> 10
MINUTE(time)
Повертає кількість хвилин для аргумента time у діапазоні від 0 до 59:
SELECT MINUTE('98-02-03 10:05:03'); -> 5
SECOND(time)
Повертає кількість секунд для аргумента time у діапазоні від 0 до 59:
SELECT SECOND('10:05:03'); -> 3
PERIOD_ADD(P,N)
Додає N місяців до періоду P (у форматі YYMM або YYYYMM). Повертає величину у форматі YYYYMM. Слід ураховувати, що аргумент періоду P не є значенням дати:
SELECT PERIOD_ADD(9801,2); -> 199803
PERIOD_DIFF(P1,P2)
Повертає кількість місяців між періодами P1 і P2. P1 і P2 повинні бути у форматі YYMM або YYYYMM. Слід ураховувати, що аргументи періоду P1 і P2 не є значеннями дати:
SELECT PERIOD_DIFF(9802,199703); -> 11
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:
Значення Type |
Очікуваний формат expr |
SECOND |
SECONDS |
MINUTE |
MINUTES |
HOUR |
HOURS |
DAY |
DAYS |
MONTH |
MONTHS |
YEAR |
YEARS |
MINUTE_SECOND |
"MINUTES:SECONDS" |
HOUR_MINUTE |
"HOURS:MINUTES" |
DAY_HOUR |
"DAYS HOURS" |
YEAR_MONTH |
"YEARS-MONTHS" |
HOUR_SECOND |
"HOURS:MINUTES:SECONDS" |
DAY_MINUTE |
"DAYS HOURS:MINUTES" |
DAY_SECOND |
"DAYS HOURS:MINUTES:SECONDS" |
В 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
EXTRACT(type FROM date)
Типи інтервалів для функції EXTRACT() використовуються ті ж, що й для функцій DATE_ADD() або DATE_SUB.
SELECT EXTRACT(YEAR FROM "1999-07-02"); -> 1999
TO_DAYS(date)
функція повертає номер дня для дати, зазначеного в аргументі date, (кількість днів, що пройшли з року 0):
SELECT TO_DAYS(950501); -> 728779
SELECT TO_DAYS('1997-10-07'); -> 729669
FROM_DAYS(N)
Повертає величину DATE для заданого номера дня N:
mysql> SELECT FROM_DAYS(729669); -> '1997-10-07'
DATE_FORMAT(date,format)
Форматує величину date у відповідності з рядком format. У рядку format можуть використовуватися наступні визначники:
Визначник |
Опис |
% M |
Назва місяця |
% W |
Назва дня тижня |
% D |
День місяця з англійським суфіксом (1st, 2nd, 3rd і т.д.) |
% Y |
Рік, число, 4 цифри |
% y |
Рік, число, 2 цифри |
% a |
Скорочене ім’я дня тижня |
% d |
День місяця, число (00..31) |
% e |
День місяця, число (0..31) |
% m |
Місяць, число (01..12) |
% c |
Місяць, число (1..12) |
% b |
Скорочена назва місяця |
% j |
День року (001..366) |
% H |
Години (00..23) |
% k |
Години (0..23) |
% h |
Години (01..12) |
% I |
Години (01..12) |
% l |
Години (1..12) |
% i |
Хвилини, число (00..59) |
% r |
Час, 12-годинний формат (hh:mm:ss [AP]M) |
% T |
Час, 24-годинний формат (hh:mm:ss) |
% S |
Секунди (00..59) |
% s |
Секунди (00..59) |
% p |
AM або PM |
% w |
День тижня (0=неділя..6=субота) |
% U |
Тиждень (00..53), де неділя вважається першим днем тижня |
% u |
Тиждень (00..53), де понеділок вважається першим днем тижня |
% % |
Значення '%'. |
Усі інші символи просто копіюються в результуючий вираз без інтерпретації:
SELECT DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');-> 'Saturday October 1997'
SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s'); -> '22:23:00'
SELECT DATE_FORMAT('1997-10-04 22:23:00', '%D %y %a %d %m %b %j');
-> '4th 97 Sat 04 10 Oct 277'
SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H %k %I %r %T %S %w');
-> '22 22 10 10:23:00 PM 22:23:00 00 6'
SELECT DATE_FORMAT('1999-01-01', '%X %V'); -> '1998 52'
TIME_FORMAT(time,format)
Дана функція використовується аналогічно описаної вище функції DATE_FORMAT(), але рядок format може містити тільки ті визначники формату, які відносяться до годин, хвилин і секунд. При вказівці інших визначників буде повернуто NULL або 0.
CURDATE()
CURRENT_DATE
Повертає сьогоднішню дату як величину у форматі YYYY-MM-DD або YYYYMMDD, залежно від того, у якому контексті використовується функція - в рядковому або числовому:
SELECT CURDATE(); -> '1997-12-15'
SELECT CURDATE() + 0; -> 19971215
CURTIME()
CURRENT_TIME
Повертає поточний час як величину у форматі HH:MM:SS або HHMMS, залежно від того, у якому контексті використовується функція - в рядковому або числовому:
SELECT CURTIME(); -> '23:50:26'
SELECT CURTIME() + 0; -> 235026
NOW()
SYSDATE()
CURRENT_TIMESTAMP
Повертає поточну дату й час як величину у форматі YYYY-MM-DD HH:MM:SS або YYYYMMDDHHMMSS, залежно від того, у якому контексті використовується функція - рядковому або числовому еквіваленті:
SELECT NOW(); -> '1997-12-15 23:50:26'
SELECT NOW() + 0; -> 19971215235026
SEC_TO_TIME(seconds)
Повертає аргумент seconds, перетворений у години, хвилини й секунди, як величину у форматі HH:MM:SS або HHMMSS, залежно від того, у якому контексті використовується функція - в рядковому чи числовому:
SELECT SEC_TO_TIME(2378); -> '00:39:38'
SELECT SEC_TO_TIME(2378) + 0; -> 3938
TIME_TO_SEC(time)
Повертає аргумент time, перетворений у секунди:
SELECT TIME_TO_SEC('22:23:00'); -> 80580
SELECT TIME_TO_SEC('00:39:38'); -> 2378