如何在MySQL中正确处理存储的UTC日期转换(使用夏令时)?

如何在MySQL中正确处理存储的UTC日期转换(使用夏令时)?,mysql,datetime,Mysql,Datetime,我将用户创建的日期保存为带有datetime的数据库中的UTC_时间戳。 示例:CreatedDate日期时间 我知道贝娄会返回正确的结果 我怀疑旧数据是否需要在夏令时进行检查。在那之后做适当的计算是我的主要怀疑。是否需要。请给我解释清楚? 例如: 出于报告目的,我使用@@session.time_zone,否则我将在不转换的情况下向前端开发人员提供CreateDDATE。但我仍然怀疑是否需要检查夏令时和转换旧数据? 上面的查询有错误,但我要的是逻辑。来自: 时区值可以以多种格式给出,但不区分

我将用户创建的日期保存为带有datetime的数据库中的UTC_时间戳。 示例:CreatedDate日期时间

我知道贝娄会返回正确的结果

我怀疑旧数据是否需要在夏令时进行检查。在那之后做适当的计算是我的主要怀疑。是否需要。请给我解释清楚? 例如:

出于报告目的,我使用@@session.time_zone,否则我将在不转换的情况下向前端开发人员提供CreateDDATE。但我仍然怀疑是否需要检查夏令时和转换旧数据? 上面的查询有错误,但我要的是逻辑。

来自:

时区值可以以多种格式给出,但不区分大小写:

值“SYSTEM”表示时区应与相同 系统时区

该值可以作为表示与UTC的偏移量的字符串给出,例如 如“+10:00”或“-6:00”

该值可以指定为指定时区,例如 “欧洲/赫尔辛基”、“美国/东部”或“大都会”。可以指定指定的时区 仅当mysql数据库中的时区信息表 已创建并填充

如果@session.time_区域是第一种形式或第三种形式,则DST已被考虑在内

在第二种形式中,您与UTC之间只有一个固定的偏移量,因此您不能真正假设任何DST都适用。即使你可以,它也肯定不会遵循你所写的逻辑。请记住,DST并不适用于全世界,对于那些使用DST的人来说,国家之间有不同的开始和结束日期和时间

因此,您不应编写任何自定义DST调整。让convert_z做它的工作吧

select  convert_tz(utc_timestamp(),'+00:00',@@session.time_zone);
select case when  ( month(utc_timestamp())<6 and month(CreatedDate)<6 ) or 
                   ( month(utc_timestamp())>6 and month(CreatedDate)>6))
                 then  convert_tz(CreatedDate ,'+00:00',@@session.time_zone) 
             when  ( month(utc_timestamp())<6 and month(CreatedDate)>6 ) then 
                        convert_tz(CreatedDate,'+00:00',@@session.time_zone) 
                     -- require to decrease the @@session.time_zone with 1 hour
             else convert_tz(CreatedDate,'+00:00',@@session.time_zone) 
                     -- require to increase the @@session.time_zone with 1 hour
        end as CreatedDate 
from tbluser;