|
Spec-Zone .ru
спецификации, руководства, описания, API
|
Вторые значения прыжка возвращаются с частью времени, которая заканчивается :59:59.
Это означает что функция такой как NOW()
может возвратить то же самое значение в течение двух или трех последовательных секунд во время второго прыжка.
Это остается истиной, что литеральные временные значения, имеющие часть времени, которая заканчивается :59:60 или :59:61 считаются недопустимыми.
Если необходимо искать TIMESTAMP
значения за одну секунду до прыжка, вторые, аномальные результаты могут быть получены, если Вы используете
сравнение с 'YYYY-MM-DD hh:mm:ss' значения. Следующий пример демонстрирует это. Это
изменяет зону местного времени на UTC, таким образом, нет никакого различия между внутренними значениями
(которые находятся в UTC), и выведенные на экран значения (которым применяли исправление часового пояса).
mysql>CREATE TABLE t1 (->a INT,->ts TIMESTAMP DEFAULT NOW(),->PRIMARY KEY (ts)->);Query OK, 0 rows affected (0.01 sec)mysql>-- change to UTCmysql>SET time_zone = '+00:00';Query OK, 0 rows affected (0.00 sec)mysql>-- Simulate NOW() = '2008-12-31 23:59:59'mysql>SET timestamp = 1230767999;Query OK, 0 rows affected (0.00 sec)mysql>INSERT INTO t1 (a) VALUES (1);Query OK, 1 row affected (0.00 sec)mysql>-- Simulate NOW() = '2008-12-31 23:59:60'mysql>SET timestamp = 1230768000;Query OK, 0 rows affected (0.00 sec)mysql>INSERT INTO t1 (a) VALUES (2);Query OK, 1 row affected (0.00 sec)mysql>-- values differ internally but display the samemysql>SELECT a, ts, UNIX_TIMESTAMP(ts) FROM t1;+------+---------------------+--------------------+| a | ts | UNIX_TIMESTAMP(ts) |+------+---------------------+--------------------+| 1 | 2008-12-31 23:59:59 | 1230767999 || 2 | 2008-12-31 23:59:59 | 1230768000 |+------+---------------------+--------------------+2 rows in set (0.00 sec)mysql>-- only the non-leap value matchesmysql>SELECT * FROM t1 WHERE ts = '2008-12-31 23:59:59';+------+---------------------+| a | ts |+------+---------------------+| 1 | 2008-12-31 23:59:59 |+------+---------------------+1 row in set (0.00 sec)mysql>-- the leap value with seconds=60 is invalidmysql>SELECT * FROM t1 WHERE ts = '2008-12-31 23:59:60';Empty set, 2 warnings (0.00 sec)
Чтобы работать вокруг этого, можно использовать сравнение, основанное на значении UTC, фактически сохраненном в столбце, у которого есть прыжок второе примененное исправление:
mysql>-- selecting using UNIX_TIMESTAMP value return leap valuemysql>SELECT * FROM t1 WHERE UNIX_TIMESTAMP(ts) = 1230768000;+------+---------------------+| a | ts |+------+---------------------+| 2 | 2008-12-31 23:59:59 |+------+---------------------+1 row in set (0.00 sec)