2018年1月23日 星期二

民國西元年轉換處理

以下介紹如何將日期型態資料轉換為將民國年月日字串(:1070123),反之將民國年月日字串資料轉換為日期型態資料。

ORACLE操作上相當簡便,透過設定轉換格式(:eeyyyymmdd)並指定NLS_CALENDARROC Official即可輕鬆進行轉換,或者利用西元年與民國年差異值為1911為處理參考,兩者轉換如下:

SELECT TO_CHAR(SYSDATE, 'eeyyy/mm/dd',   'NLS_CALENDAR= ''ROC Official''') Dt_s1
      , TO_CHAR(SYSDATE, 'yyy/mm/dd',     'NLS_CALENDAR= ''ROC Official''') Dt_s2
      , TO_CHAR(SYSDATE, 'yyymmdd',       'NLS_CALENDAR= ''ROC Official''') Dt_s3
      , TO_CHAR(SYSDATE, 'yyy""mm""dd""', 'NLS_CALENDAR= ''ROC Official''') Dt_s3b
      , CAST(TO_CHAR(SYSDATE, 'yyyymmdd')-19110000 AS VARCHAR2(10))         Dt_s3c
      ------
      , TO_DATE('中華民國107/01/23','eeyyy/mm/dd','NLS_CALENDAR= ''ROC Official''') Dt_d1
      , TO_DATE('107/01/23','yyy/mm/dd''NLS_CALENDAR= ''ROC Official''') Dt_d2
      , TO_DATE('98/01/23','yyy/mm/dd',   'NLS_CALENDAR= ''ROC Official''') Dt_d2b 
      , TO_DATE('1070123','yyymmdd',      'NLS_CALENDAR= ''ROC Official''') Dt_d3
FROM DUAL;

#
語法
輸出
1
TO_CHAR(SYSDATE'eeyyy/mm/dd',   'NLS_CALENDAR= ''ROC Official''')
中華民國107/01/23
2
TO_CHAR(SYSDATE'yyy/mm/dd',     'NLS_CALENDAR= ''ROC Official''')
107/01/23
3
TO_CHAR(SYSDATE'yyymmdd',       'NLS_CALENDAR= ''ROC Official''')
1070123
4
TO_CHAR(SYSDATE'yyy""mm""dd""''NLS_CALENDAR= ''ROC Official''')
1070123
5
CAST(TO_CHAR(SYSDATE'yyyymmdd')-19110000 AS VARCHAR2(10))
1070123
6
TO_DATE('中華民國107/01/23','eeyyy/mm/dd'
'NLS_CALENDAR= ''ROC Official''')
2018/1/23
7
TO_DATE('107/01/23','yyy/mm/dd',  'NLS_CALENDAR= ''ROC Official''')
2018/1/23
8
TO_DATE('98/01/23','yyy/mm/dd',   'NLS_CALENDAR= ''ROC Official''')
2009/1/23
9
TO_DATE('1070123','yyymmdd',      'NLS_CALENDAR= ''ROC Official''')
2018/1/23


MSSQL指令整理如下,將分成日期轉換為各種格式字串,以及將民國年轉換回日期型態,如下:
SELECT FORMAT(Dt, 'd'       , 'en-US')  'US-d'
     , FORMAT(Dt, 'd'       , 'zh-TW')  'TW-d'
     , FORMAT(Dt, 'D'       , 'zh-TW')  'TW-1'
     , STUFF(FORMAT(Dt, 'D' , 'zh-TW'), 1, 4,  YEAR(Dt)-1911)  'TW-2'
     , STUFF(CONVERT(VARCHAR(10), Dt, 120), 1, 4,  YEAR(Dt)-1911) 'TW-3'
     , STUFF(CONVERT(VARCHAR(10), Dt, 112), 1, 4,  YEAR(Dt)-1911) 'TW-4'
FROM
    (
    SELECT CAST('2018/01/23' AS datetime) Dt
    ) A

#
語法
輸出
1
FORMAT(Dt, 'd'          , 'en-US')
1/23/2018
2
FORMAT(Dt, 'd'       , 'zh-TW')
2018/1/23
3
FORMAT(Dt, 'D'       , 'zh-TW')
2018123
4
STUFF(FORMAT(Dt, 'D' , 'zh-TW'), 1, 4,  YEAR(Dt)-1911)
107123
5
STUFF(CONVERT(VARCHAR(10), Dt, 120), 1, 4,  YEAR(Dt)-1911)
107-01-23
6
STUFF(CONVERT(VARCHAR(10), Dt, 112), 1, 4,  YEAR(Dt)-1911)
1070123

同樣也會使用西元年與民國年差異值運算,但會使用到MSSQL非常好用的STUFF字串填補(移除)運算指令,將由第一碼開始置換,並由此先移除四個字元(2018-01-23),再將年度運算結果進行置換(2018-1911=107),結果即民國年日期(107-01-23),更詳細說明建議參考另一篇文章[MSSQL] STUFF字串置換函數使用方法及範圍 而將民國年轉回日期型態,首先將換為8位數之數值,再扣除19110000即可,如下:

SELECT ChYr
     , CAST(STR(ChYr+19000000) AS DATETIME) Dt
FROM (VALUES('970123'), ('1070123')) Yr(ChYr)
UNION ALL
SELECT ChYr
     , CAST(STR(REPLACE(ChYr,'-', '')+19000000) AS DATETIME)

FROM (VALUES('97-01-23'), ('107-01-23')) Yr(ChYr)

沒有留言:

張貼留言