Каково поведение оператора минус между двумя датами в MySQL? - PullRequest
5 голосов
/ 06 июня 2011

Разница между датами и временем - это количество секунд между ними. Похоже, что это работает, только если дата и время происходят в один и тот же час.

Почему это?

mysql> update events set created_at = "2011-04-13 15:59:59", fulfilled_at ="2011-04-13 16:00:00" where id = 1;
mysql> select fulfilled_at - created_at, timediff(fulfilled_at, created_at) from events where id = 1;
+---------------------------+------------------------------------+
| fulfilled_at - created_at | timediff(fulfilled_at, created_at) |
+---------------------------+------------------------------------+
|               4041.000000 | 00:00:01                           |
+---------------------------+------------------------------------+

Я знаю, что должен использовать timediff, но мне просто любопытно, почему я это вижу или это где-то задокументировано.

Ответы [ 2 ]

8 голосов
/ 06 июня 2011

MySQL просто конвертирует строки в числа как можно лучше, чтобы он мог выполнять математические операции над ними.В этом случае просто удаляются все нечисловые двоеточия, тире и пробелы.

Попробуйте:

SELECT (20110413155959 - 20110413160000) AS dates;

Ваши даты, без всего, что мешает им быть числамирезультат -4041

6 голосов
/ 06 июня 2011

Напомним, что в mysql есть два разных типа вычитаний, связанных с датой и временем: суффикс _SUB предназначен для вычитания даты без интервала , возвращая date .Суффикс _DIFF предназначен для получения разности между двумя датами , возвращая интервал (Кстати, обратите внимание, что только у первой есть обратный аналог: _ADD )

Знаки +/- должны использоваться для первого (ADD / SUB), поэтому MYSQL ожидает интервал в качестве второго аргумента.

DATE = DATE_ADD(DATE,INTERVAL)    Also accepts +
DATE = DATE_SUB(DATE,INTERVAL)    Also accepts -
INTERVAL = DATE_DIFF(DATE,DATE ) 

См. Документ здесь , бит начинается с:

Date arithmetic also can be performed using INTERVAL 
together with the + or - operator... 

Следовательно, некорректно использовать - для определения разницы между двумя датами.Теперь MYSQL, столкнувшись с неверными выводами, пытается сделать лучшее предположение (вместо того, чтобы выдавать ошибку), иногда это идет хорошо, иногда нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...