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 UTC
mysql>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 same
mysql>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 matches
mysql>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 invalid
mysql>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 value
mysql>SELECT * FROM t1 WHERE UNIX_TIMESTAMP(ts) = 1230768000;
+------+---------------------+| a | ts |+------+---------------------+| 2 | 2008-12-31 23:59:59 |+------+---------------------+1 row in set (0.00 sec)