以下介紹如何將日期型態資料轉換為將民國年月日字串(如:1070123),反之將民國年月日字串資料轉換為日期型態資料。
ORACLE操作上相當簡便,透過設定轉換格式(如:eeyyyymmdd)並指定NLS_CALENDAR為ROC 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''')
|
107年01月23日
|
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')
|
2018年1月23日
|
4
|
STUFF(FORMAT(Dt, 'D' , 'zh-TW'), 1, 4, YEAR(Dt)-1911)
|
107年1月23日
|
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)
沒有留言:
張貼留言