剛朋友問到有關存在 MSSQL 中的文字資料是民國日期, 例如 67/3/12 這樣的格式, 要轉出西元日期, 其實還蠻單純的, 只需要找出第一個 ‘/’ 在什麼位置, 就很容易了, 查找 ‘/’ 的函數使用 charindex, 如下:
declare @a varchar(20) select @a = '67/6/7' select charindex('/', @a)
這樣取出的值為 3, 也就是第 3個字元, 而下一步就是取出年的部份, 如下:
declare @a varchar(20) select @a = '67/6/7' select substring(@a, 1, charindex('/', @a)-1)
這樣取出的值為 67, 於是要轉出西元年其實就是先轉成 int 後, 加上 1911 再轉回字串後, 加回原來的月/日的部分, 如下:
declare @a varchar(20) select @a = '67/6/7' select convert(varchar, convert(int, substring(@a, 1, charindex('/', @a)-1))+1911)+ substring(@a, charindex('/', @a), 10)
其中最後一個 substring 中的取出長度 hardcode 寫 10 是一個小技巧, 不用真的算出取出長度, 而固定給一個大於此字串的長度, 就可以取出完整字串, 所以上面的結果就會是 1978/6/7, 而 substring 最後一個參數可以參考線上說明:
http://msdn.microsoft.com/en-us/library/ms187748.aspx
其中的 length_expression 參數的說明, 其中有提到
If the sum of start_expression and length_expression is greater than the number of characters in value_expression, the whole value expression beginning at start_expression is returned.
如此一來, 便可以一次在 sql command 中將原存在資料庫中的民國年日期轉出為西元年, 例如 table:
userid birthday
—————
1 67/3/12
2 79/2/11
語法如下:
select userid, birthday, convert(varchar, convert(int, substring(birthday, 1, charindex('/', birthday)-1))+1911)+ substring(birthday, charindex('/', birthday), 10) as birthday2 from table1
會取出:
userid birthday birthday2
————————
1 67/3/12 1978/3/12
2 79/2/11 1990/2/11
給大家參考!