sql 時(shí)區(qū) 夏令時(shí) 冬令時(shí)

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

RETURNS datetime

? ? COMMENT '歐洲中部時(shí)間(帶夏令時(shí))轉(zhuǎn)換成北京時(shí)間'

BEGIN

DECLARE is_summer INT ;

DECLARE summer_start_date , summer_end_date DATETIME;

DECLARE day_of_week INT ;

-- 獲取當(dāng)年夏令時(shí)的開始和結(jié)束時(shí)間

-- 歐洲中部夏令時(shí):每年3月最后一個(gè)周日凌晨2點(diǎn)開始,至10月最后一個(gè)周日凌晨2點(diǎn)結(jié)束

SET summer_start_date = STR_TO_DATE(concat(year(europe_time),'-03-31 02:00:00' ),'%Y-%m-%d %H:%i:%s'); -- 當(dāng)年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);-- 往前倒推至最近一個(gè)周日

END IF;

SET summer_end_date = STR_TO_DATE(concat(year(europe_time),'-10-31 02:00:00' ),'%Y-%m-%d %H:%i:%s'); -- 當(dāng)年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);-- 往前倒推至最近一個(gè)周日

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

-- 夏令時(shí)比UTC快兩個(gè)小時(shí)

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

ELSE

-- 冬令時(shí)比UTC快一個(gè)小時(shí)

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 '北京時(shí)間轉(zhuǎn)換成歐洲中部時(shí)間(帶夏令時(shí))'

BEGIN

DECLARE is_summer INT ;

DECLARE summer_start_date , summer_end_date DATETIME;

DECLARE day_of_week INT ;

-- 獲取當(dāng)年夏令時(shí)的開始和結(jié)束時(shí)間

-- 歐洲中部夏令時(shí):每年3月最后一個(gè)周日凌晨2點(diǎn)開始,至10月最后一個(gè)周日凌晨2點(diǎn)結(jié)束

SET summer_start_date = STR_TO_DATE(concat(year(beijing_time),'-03-31 02:00:00' ),'%Y-%m-%d %H:%i:%s'); -- 當(dāng)年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);-- 往前倒推至最近一個(gè)周日

END IF;

SET summer_end_date = STR_TO_DATE(concat(year(beijing_time),'-10-31 02:00:00' ),'%Y-%m-%d %H:%i:%s'); -- 當(dāng)年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);-- 往前倒推至最近一個(gè)周日

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

-- 夏令時(shí)比UTC快兩個(gè)小時(shí)

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

ELSE

-- 冬令時(shí)比UTC快一個(gè)小時(shí)

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

END IF;

END;;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 12,441評(píng)論 6 13
  • **2014真題Directions:Read the following text. Choose the be...
    又是夜半驚坐起閱讀 11,141評(píng)論 0 23
  • 到三亞的第一晚,任性地決定了露宿車站前的一個(gè)花壇。平生終于有了第一次以地為床,以天作被的落拓豪邁之舉。夜風(fēng)...
    行者李青益閱讀 633評(píng)論 0 2
  • 文/Joy_Winslet 我的世界很小 短短的街道,偶爾跳過幾只野貓 不繁華,不熱鬧 也絕不會(huì)有新聞?lì)^條 有的只...
    Joy_Winslet閱讀 456評(píng)論 8 6
  • 好友小兩口皆好茶,依著興趣,在天山茶城盤了一間茶室,專營普洱、滇紅等紅茶。自從有緣相識(shí),每有閑暇之時(shí),我都會(huì)去好友...
    和小雨閱讀 390評(píng)論 0 1

友情鏈接更多精彩內(nèi)容