Detect if a date is in Daylight saving time in MySql
我继承了遗留应用程序,其中所有日期和时间都存储在本地时区(英国)。 我无法改变这些存储的方式。
但是,要求是在应用程序中显示GMT中的所有日期。 因此,当我从数据库中检索事件列表时,我需要它以这种时间格式显示它们,同时观察每个特定事件日期是否正在运行夏令时。 使用以下逻辑,我可以确定查询中的夏令时是否处于活动状态:
1 2 | 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查询本身内检测给定日期是否在DST中?
任何帮助,非常感谢。
时区不存储在DATETIME值中。 有趣的是,它们适用于TIMESTAMP。
给定存储日期,您可以根据当地规则追踪DST当时是否"开启"。 由于您无法更改日期,我猜您无法添加列来存储时区...
创建包含规则的存储过程并将给定日期转换为GMT。
请注意,只有居住在格林威治附近的人希望他们的时间显示在GMT中。:)
祝好运。
发现一个丑陋复杂的方式,@ DT输入日期和时间
1 2 3 4 5 6 7 | 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 |
你在英国。 所以,你的TZ应该是CET或CEST(中欧夏令时)。 您可以通过这种方式获取信息:
1 2 3 4 5 6 | mysql> SELECT @@system_time_zone; +--------------------+ | @@system_time_zone | +--------------------+ | CEST | +--------------------+ |
我在许多存储过程中使用它。 注意:我需要两种形式的TZ信息,无论是否需要使用DST计算偏移量。
1 2 3 4 5 6 |
你可以从中获得灵感。