sql 时区 夏令时 冬令时

CREATE DEFINER = CURRENT_USER FUNCTION `func_time_europe_to_beijing`(`europe_time` datetime)

RETURNS datetime

    COMMENT '欧洲中部时间(带夏令时)转换成北京时间'

BEGIN

DECLARE is_summer INT ;

DECLARE summer_start_date , summer_end_date DATETIME;

DECLARE day_of_week INT ;

-- 获取当年夏令时的开始和结束时间

-- 欧洲中部夏令时:每年3月最后一个周日凌晨2点开始,至10月最后一个周日凌晨2点结束

SET summer_start_date = STR_TO_DATE(concat(year(europe_time),'-03-31 02:00:00' ),'%Y-%m-%d %H:%i:%s'); -- 当年3月最后一天

SET day_of_week = DAYOFWEEK(summer_start_date);

IF day_of_week > 1 THEN

SET summer_start_date = ADDDATE(summer_start_date,INTERVAL 1-day_of_week DAY);-- 往前倒推至最近一个周日

END IF;

SET summer_end_date = STR_TO_DATE(concat(year(europe_time),'-10-31 02:00:00' ),'%Y-%m-%d %H:%i:%s'); -- 当年10月最后一天

SET day_of_week = DAYOFWEEK(summer_end_date);

IF day_of_week > 1 THEN

SET summer_end_date = ADDDATE(summer_end_date,INTERVAL 1-day_of_week DAY);-- 往前倒推至最近一个周日

END IF;

IF europe_time > summer_start_date AND

europe_time < summer_end_date THEN

SET is_summer = 1;

END IF;

IF is_summer = 1 THEN

-- 夏令时比UTC快两个小时

RETURN convert_tz(europe_time, '+02:00', '+08:00');

ELSE

-- 冬令时比UTC快一个小时

RETURN convert_tz(europe_time, '+01:00', '+08:00');

END IF;

END;

CREATE DEFINER = CURRENT_USER FUNCTION `func_time_beijing_to_europe`(`beijing_time` datetime)

RETURNS datetime

    COMMENT '北京时间转换成欧洲中部时间(带夏令时)'

BEGIN

DECLARE is_summer INT ;

DECLARE summer_start_date , summer_end_date DATETIME;

DECLARE day_of_week INT ;

-- 获取当年夏令时的开始和结束时间

-- 欧洲中部夏令时:每年3月最后一个周日凌晨2点开始,至10月最后一个周日凌晨2点结束

SET summer_start_date = STR_TO_DATE(concat(year(beijing_time),'-03-31 02:00:00' ),'%Y-%m-%d %H:%i:%s'); -- 当年3月最后一天

SET day_of_week = DAYOFWEEK(summer_start_date);

IF day_of_week > 1 THEN

SET summer_start_date = ADDDATE(summer_start_date,INTERVAL 1-day_of_week DAY);-- 往前倒推至最近一个周日

END IF;

SET summer_end_date = STR_TO_DATE(concat(year(beijing_time),'-10-31 02:00:00' ),'%Y-%m-%d %H:%i:%s'); -- 当年10月最后一天

SET day_of_week = DAYOFWEEK(summer_end_date);

IF day_of_week > 1 THEN

SET summer_end_date = ADDDATE(summer_end_date,INTERVAL 1-day_of_week DAY);-- 往前倒推至最近一个周日

END IF;

IF beijing_time > summer_start_date AND

beijing_time < summer_end_date THEN

SET is_summer = 1;

END IF;

IF is_summer = 1 THEN

-- 夏令时比UTC快两个小时

RETURN convert_tz(beijing_time, '+02:00', '+08:00');

ELSE

-- 冬令时比UTC快一个小时

RETURN convert_tz(beijing_time, '+01:00', '+08:00');

END IF;

END;;

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,248评论 6 13
  • **2014真题Directions:Read the following text. Choose the be...
    又是夜半惊坐起阅读 10,066评论 0 23
  • 到三亚的第一晚,任性地决定了露宿车站前的一个花坛。平生终于有了第一次以地为床,以天作被的落拓豪迈之举。夜风...
    行者李青益阅读 578评论 0 2
  • 文/Joy_Winslet 我的世界很小 短短的街道,偶尔跳过几只野猫 不繁华,不热闹 也绝不会有新闻头条 有的只...
    Joy_Winslet阅读 428评论 8 6
  • 好友小两口皆好茶,依着兴趣,在天山茶城盘了一间茶室,专营普洱、滇红等红茶。自从有缘相识,每有闲暇之时,我都会去好友...
    和小雨阅读 340评论 0 1