Skip to content

Instantly share code, notes, and snippets.

@pastorramos
Last active October 23, 2019 16:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pastorramos/c0102b73f03c31cdb3ff10e0e3cb9a44 to your computer and use it in GitHub Desktop.
Save pastorramos/c0102b73f03c31cdb3ff10e0e3cb9a44 to your computer and use it in GitHub Desktop.
Calcula la duración entre dos fechas que se ven afectadas por un cambio de horario de verano a invierno en España
/* Script dst.sql: calcula la duración entre dos fechas que se ven afectadas */
/* por un cambio de horario de verano a invierno en España */
/* Guarda el valor de la zona horaria */
SET @current_tz = @@SESSION.time_zone;
/* Crea la tabla t3 que contiene un campo para las fechas del tipo TIMESTAMP */
USE datetests;
DROP TABLE IF EXISTS t3;
CREATE TABLE t3(id INT, ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP());
/* Establece la zona horaria de la sesión a España */
SET @@SESSION.time_zone = 'Europe/Madrid';
/* Establece la fecha y hora a media hora antes del cambio de horario */
/* Esto es a las 2:30 AM CEST en el horario de verano */
\! echo "";
\! echo "Adelanta el tiempo media hora antes del cambio a horario de invierno CET";
SET timestamp = (SELECT UNIX_TIMESTAMP('2019-10-27 02:30:00')); /* 1572136200 */
\! echo "Inserta esta primera fecha en la tabla";
INSERT INTO t3 (id) VALUES (1);
\! echo "Europe/Madrid 2019-10-27 2:30 CEST";
SELECT NOW();
\! echo "";
\! echo "Adelanto de media hora más para forzar el cambio de horario";
\! echo "Europe/Madrid 2019-10-27 3:00 CEST = Europe/Madrid 2019-10-27 2:00 CET";
SET @@SESSION.timestamp = @@SESSION.timestamp + 1800;
SELECT NOW();
\! echo "";
\! echo "Adelanta media hora más para que se hagan las 2:30, pero ya en horario de invierno CET";
SET @@SESSION.timestamp = @@SESSION.timestamp + 1800;
\! echo "Inserta la segunda fecha en la tabla";
INSERT INTO t3 (id) VALUES (2);
SELECT NOW();
/* Aquí se produce la magia */
SET @@SESSION.time_zone = 'UTC';
/* Lee los valores internos que están en UTC */
SET @first_date = (SELECT ts FROM t3 WHERE id = 1);
SET @second_date = (SELECT ts FROM t3 WHERE id = 2);
/* Visualiza la tabla en UTC */
\! echo "";
\! echo "Visualiza las fechas internas, cambiando la zona a UTC";
SELECT * FROM t3;
/* Calcula la diferencia como siempre */
\! echo "";
\! echo "Visualiza el tiempo transcurrido";
SELECT TIMEDIFF(@second_date, @first_date) AS elapsed_time;
/* Vuelve a establecer la zona */
SET @@SESSION.time_zone = 'Europe/Madrid';
\! echo "";
\! echo "Visualiza la tabla normalmente como se ven las horas locales, cambiando la zona a Europe/Madrid";
SELECT * FROM t3;
/* Restaura el valor de la zona horaria y la hora actual */
SET @@SESSION.time_zone = @current_tz;
SET @@SESSION.timestamp = DEFAULT;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment