Spec-Zone .ru
спецификации, руководства, описания, API

3.3.4.5. Вычисления даты

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).