Лекція 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