-> - (RIGHT(CURRENT_DATE,5)<RIGHT(birth,5)) AS age FROM pet ORDER BY age;
name
birth
CURRENT_DATE
age
Chirpy
1998-09-11
2001-08-29
Puffball
1999-03-30
2001-08-29
Whistler
1997-12-09
2001-08-29
Slim
1996-04-29
2001-08-29
Claws
1994-03-17
2001-08-29
Fluffy
1993-02-04
2001-08-29
Fang
1990-08-27
2001-08-29
Bowser
1989-08-31
2001-08-29
Buffy
1989-05-13
2001-08-29
Подобный же запрос поможет определить возраст, которого достигли умершие животные на момент смерти. Выделить умерших животных можно, проверив значение поля death на предмет равенства NULL. Затем для записей, значения поля death которых не равно NULL, можно вычислить разницу между датами смерти и рождения:
mysql> SELECT name, birth, death, (YEAR(death)-YEAR(birth)) - (RIGHT(death,5)<RIGHT(birth,5)) AS age FROM pet WHERE death IS NOT NULL ORDER BY age;
name
birth
death
age
Bowser
1989-08-31
1995-07-29
В MySQL предусмотрено несколько функций для получения частей дат - YEAR(), MONTH(), и DAYOFMONTH(). mysql> SELECT name, birth, MONTH(birth) FROM pet;
name
birth
MONTH(birth)
Fluffy
1993-02-04
Claws
1994-03-17
Buffy
1989-05-13
Fang
1990-08-27
Bowser
1989-08-31
Chirpy
1998-09-11
Whistler
1997-12-09
Slim
1996-04-29
Puffball
1999-03-30
Найти животных, дни рождения которых наступят в следующем месяце, тоже несложно. Предположим, что сейчас на дворе апрель. Тогда номер текущего месяца - 4, а искать надо животных, родившихся в мае (5-м месяце), таким образом:
mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5;
name
birth
Buffy
1989-05-13
Конечно, в декабре возникают некоторые осложнения. Если просто добавить единицу к номеру месяца (12) и поискать животных, родившихся в тринадцатом месяце, найти что-нибудь вряд ли удастся. Вместо этого нужно искать животных, родившихся в январе (1-м месяце). Можно даже написать небольшой запрос, который будет работать вне зависимости от того, какой нынче месяц. Функция DATE_ADD() позволяет прибавить к дате некоторый интервал времени. Если добавить к значению, возвращаемому функцией NOW(), месяц, а затем извлечь из получившейся даты номер месяца при помощи функции MONTH(), мы получим именно тот месяц, который нам нужен:
mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = MONTH(DATE_ADD(NOW(), INTERVAL 1 MONTH));
Ту же задачу можно решить и другим методом - для этого нужно прибавить единицу к номеру месяца, следующего за текущим (воспользовавшись функцией расчета по модулю (MOD) для перехода к 0, если номер текущего месяца равен 12):
mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = MOD(MONTH(NOW()), 12) + 1;
Функция MONTH возвращает число от 1 до 12, а выражение MOD(число,12) - число от 0 до 11. Поэтому операцию сложения нужно проводить после MOD(), иначе результат перепрыгнет с ноября (11) сразу на январь (1).
Примеры стандартных запросов
В некоторых из примеров используется таблица shop (магазин), в которой содержатся цены по каждому изделию (item number)для определенных продавцов (dealer). Каждый продавец имеет одну фиксированную цену для каждого изделия; тогда пара изделие-продавец (article, dealer) является первичным ключом для записей таблицы.
CREATE TABLE shop ( article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL, dealer CHAR(20) DEFAULT '' NOT NULL, price DOUBLE(16,2) DEFAULT '0.00' NOT NULL, PRIMARY KEY(article, dealer));
INSERT INTO shop VALUES(1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),(3,'C',1.69),(3,'D',1.25),(4,'D',19.95);