Определить, если дата в летнее время в MySql - PullRequest
1 голос
/ 25 октября 2010

Я унаследовал устаревшее приложение, в котором все даты и время хранятся в местном часовом поясе (Великобритания). Я не могу изменить, как они хранятся.

Однако требуется, чтобы в приложении отображались все даты по Гринвичу. Поэтому, когда я получаю список событий из базы данных, мне нужно, чтобы он отображал их все в этом формате времени, наблюдая, работает ли летнее время для каждой конкретной даты события. Используя следующую логику, я могу определить, активно ли летнее время в запросе:

IF(CAST(TIMEDIFF(NOW(), UTC_TIMESTAMP()) AS SIGNED) >0, 
 DATE_FORMAT(CONVERT_TZ(ADDTIME(`event_date`, IFNULL(`event_time`, '00:00')), '+01:00', '+00:00'), '%H:%i'), `event_time`) AS event_time

Это, однако, явно проверяет только дату запуска. Поэтому любые события в будущем, которые пересекают границы перехода на летнее время, не работают.

Есть ли способ определить, есть ли указанная дата в летнее время в самом запросе mysql?

Любая помощь, высоко ценится.

Ответы [ 3 ]

1 голос
/ 11 сентября 2012

Часовые пояса не сохраняются в значениях DATETIME. Интересно, что они для TIMESTAMPs.

Учитывая сохраненную дату, вы можете посмертно выяснить, был ли DST «включен» в то время на основе местных правил. Поскольку вы не можете изменить даты, я думаю, вы не можете добавить столбец для хранения часового пояса ...

Создание хранимой процедуры, которая содержит правила и преобразует данную дату в GMT.

Обратите внимание, что только люди, которые живут вокруг Гринвича, хотят, чтобы их время отображалось в GMT. :)

Удачи.

0 голосов
/ 03 сентября 2015

нашел ужасно сложный способ, @DT вводит дату и время

Set @DT=20150329020304; # -> 0

Set @DT=20150329030304; # -> 1(-0.0511)

Set @DT=20150329040304; # -> 1(-1)

Select 0!=(UNIX_TIMESTAMP(@DT)-   UNIX_TIMESTAMP(Concat(Year(@DT),'0101',Time_Format(@DT,'%H%i%s')))-DateDiff(@DT,Concat(Year(@DT),'0101',Time_Format(@DT,'%H%i%s')))*86400)/3600 as DlsIsOn
0 голосов
/ 08 апреля 2015

Ты в Великобритании.Итак, ваш TZ должен быть CET или CEST (летнее время Центральной Европы).Вы можете получить информацию следующим образом:

mysql> SELECT @@system_time_zone;
+--------------------+
| @@system_time_zone |
+--------------------+
| CEST               |
+--------------------+

Я использую это во многих моих хранимых процедурах.Примечание: мне нужны обе формы информации о TZ, независимо от того, нужно ли мне вычислять смещения с применением DST или без него.

CASE @@system_time_zone
  WHEN 'CET'  THEN SET l_tz = 'Europe/Paris';   SET l_tzOff = '+1:00';
  WHEN 'CEST' THEN SET l_tz = 'Europe/Paris';   SET l_tzOff = '+1:00';
  WHEN 'SGT'  THEN SET l_tz = 'Asia/Singapore'; SET l_tzOff = '+8:00';
  ELSE             SET l_tz = 'Europe/Paris';   SET l_tzOff = '+1:00';
END CASE;

Вы можете получить от этого вдохновение.

...