Spec-Zone .ru
спецификации, руководства, описания, API
|
MySQL обеспечивает несколько функций, которые можно использовать, чтобы выполнить вычисления в даты, например, вычислить возрасты или части извлечения дат.
Чтобы определить, сколько годы каждое из Ваших домашних животных, используйте TIMESTAMPDIFF()
функция. Его параметрами является модуль, в котором Вы хотите
результат, выраженный, и две даты, для которых можно взять различие. Следующие шоу запроса, для каждого
домашнего животного, даты рождения, текущей даты, и возраста в годах. Псевдоним
(age
) используется, чтобы заставить столбец окончательного результата маркировать
более значимым.
mysql>SELECT name, birth, CURDATE(),
->TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
->FROM pet;
+----------+------------+------------+------+| name | birth | CURDATE() | age |+----------+------------+------------+------+| Fluffy | 1993-02-04 | 2003-08-19 | 10 || Claws | 1994-03-17 | 2003-08-19 | 9 || Buffy | 1989-05-13 | 2003-08-19 | 14 || Fang | 1990-08-27 | 2003-08-19 | 12 || Bowser | 1989-08-31 | 2003-08-19 | 13 || Chirpy | 1998-09-11 | 2003-08-19 | 4 || Whistler | 1997-12-09 | 2003-08-19 | 5 || Slim | 1996-04-29 | 2003-08-19 | 7 || Puffball | 1999-03-30 | 2003-08-19 | 4 |+----------+------------+------------+------+
Работы запроса, но результат могли быть отсканированы более легко, если бы строки были представлены в некотором
порядке. Это может быть сделано, добавляя ORDER BY name
пункт, чтобы сортировать
вывод по имени:
mysql>SELECT name, birth, CURDATE(),
->TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
->FROM pet ORDER BY name;
+----------+------------+------------+------+| name | birth | CURDATE() | age |+----------+------------+------------+------+| Bowser | 1989-08-31 | 2003-08-19 | 13 || Buffy | 1989-05-13 | 2003-08-19 | 14 || Chirpy | 1998-09-11 | 2003-08-19 | 4 || Claws | 1994-03-17 | 2003-08-19 | 9 || Fang | 1990-08-27 | 2003-08-19 | 12 || Fluffy | 1993-02-04 | 2003-08-19 | 10 || Puffball | 1999-03-30 | 2003-08-19 | 4 || Slim | 1996-04-29 | 2003-08-19 | 7 || Whistler | 1997-12-09 | 2003-08-19 | 5 |+----------+------------+------------+------+
Сортировать вывод age
вместо name
, только используйте
различное ORDER BY
пункт:
mysql>SELECT name, birth, CURDATE(),
->TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
->FROM pet ORDER BY age;
+----------+------------+------------+------+| name | birth | CURDATE() | age |+----------+------------+------------+------+| Chirpy | 1998-09-11 | 2003-08-19 | 4 || Puffball | 1999-03-30 | 2003-08-19 | 4 || Whistler | 1997-12-09 | 2003-08-19 | 5 || Slim | 1996-04-29 | 2003-08-19 | 7 || Claws | 1994-03-17 | 2003-08-19 | 9 || Fluffy | 1993-02-04 | 2003-08-19 | 10 || Fang | 1990-08-27 | 2003-08-19 | 12 || Bowser | 1989-08-31 | 2003-08-19 | 13 || Buffy | 1989-05-13 | 2003-08-19 | 14 |+----------+------------+------------+------+
Подобный запрос может использоваться, чтобы определить возраст в смерти для животных, которые умерли. Вы
определяете, какие животные они, проверяя ли death
значение NULL
.
Затем, для тех с не -NULL
значения, вычислите различие между death
и birth
значения:
mysql>SELECT name, birth, death,
->TIMESTAMPDIFF(YEAR,birth,death) AS age
->FROM pet WHERE death IS NOT NULL ORDER BY age;
+--------+------------+------------+------+| name | birth | death | age |+--------+------------+------------+------+| Bowser | 1989-08-31 | 1995-07-29 | 5 |+--------+------------+------------+------+
Использование запроса death IS NOT NULL
вместо death <>
NULL
потому что NULL
специальное значение, которое не может быть сравнено,
используя обычные операторы сравнения. Это обсуждается позже. См. Раздел
3.3.4.6, "Работающий с NULL
Значения".
Что, если Вы хотите знать, у каких животных есть дни рождения в следующем месяце? Для этого типа вычисления год
и день не важны; Вы просто хотите извлечь часть месяца birth
столбец. MySQL
обеспечивает несколько функций для того, чтобы они извлекли части дат, такой как YEAR()
, MONTH()
, и DAYOFMONTH()
. MONTH()
соответствующая функция здесь. Чтобы видеть, как это работает,
выполняет простой запрос, который выводит на экран значение обоих birth
и MONTH(birth)
:
mysql> SELECT name, birth, MONTH(birth) FROM
pet;
+----------+------------+--------------+| name | birth | MONTH(birth) |+----------+------------+--------------+| Fluffy | 1993-02-04 | 2 || Claws | 1994-03-17 | 3 || Buffy | 1989-05-13 | 5 || Fang | 1990-08-27 | 8 || Bowser | 1989-08-31 | 8 || Chirpy | 1998-09-11 | 9 || Whistler | 1997-12-09 | 12 || Slim | 1996-04-29 | 4 || Puffball | 1999-03-30 | 3 |+----------+------------+--------------+
Обнаружение животных со днями рождения в предстоящем месяце также просто. Предположите, что текущий месяц
является апрелем. Затем значение месяца 4
и можно искать животных, перенесенных в
мае (месяц 5
) как это:
mysql> SELECT name, birth FROM pet WHERE MONTH(birth)
= 5;
+-------+------------+| name | birth |+-------+------------+| Buffy | 1989-05-13 |+-------+------------+
Есть маленькая сложность, если текущий месяц является декабрем. Невозможно просто добавить тот к числу месяца
(12
) и ищите животных, перенесенных в месяце 13
,
потому что нет такого месяца. Вместо этого Вы ищете животных, перенесенных в январе (месяц 1
).
Можно записать запрос так, чтобы он работал независимо от того, каков текущий месяц, так, чтобы Вы не
использовали число в течение определенного месяца. DATE_ADD()
позволяет Вам добавить временной интервал к данной дате. Если Вы
добавляете месяц к значению CURDATE()
,
тогда извлеките часть месяца с MONTH()
,
результат производит месяц, в котором можно искать дни рождения:
mysql>SELECT name, birth FROM pet
->WHERE MONTH(birth) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH));
Различный способ выполнить ту же самую задачу состоит в том, чтобы добавить 1
добраться в следующем месяце после текущего после использования функции по модулю (MOD
) обертывать значение месяца к 0
если это в
настоящий момент 12
:
mysql>SELECT name, birth FROM pet
->WHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1;
MONTH()
возвращает число
между 1
и 12
. И MOD(something,12)
возвращает число между 0
и
11
. Таким образом, дополнение должно быть после MOD()
, иначе мы пошли бы с ноября (11
) до января
(1
).