Last active
October 23, 2019 16:39
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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