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

10.6.2. Прыжок Часового пояса Вторая Поддержка

Вторые значения прыжка возвращаются с частью времени, которая заканчивается :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)