民國日期轉換為西元語法 |
答題得分者是:老大仔
|
kuf41
中階會員 發表:14 回覆:45 積分:51 註冊:2006-12-03 發送簡訊給我 |
|
老大仔
尊榮會員 發表:78 回覆:837 積分:1088 註冊:2006-07-06 發送簡訊給我 |
僅供參考
http://delphi.ktop.com.tw/board.php?cid=30&fid=66&tid=45174 http://delphi.ktop.com.tw/board.php?cid=30&fid=66&tid=44335 ===================引 用 kuf41 文 章=================== 民國換成西元的Function(Date_TWtoUS)要如何寫 ? 例如: Select Date_TWtoUS('98.01.01') =>2009/01/01 ? Select Date_TWtoUS('102/01/01') =>2013/01/01 ? Select Date_TWtoUS('A8.01.01') =>Null ? Select Date_TWtoUS('98.21.01') =>Null |
kuf41
中階會員 發表:14 回覆:45 積分:51 註冊:2006-12-03 發送簡訊給我 |
|
老大仔
尊榮會員 發表:78 回覆:837 積分:1088 註冊:2006-07-06 發送簡訊給我 |
|
kuf41
中階會員 發表:14 回覆:45 積分:51 註冊:2006-12-03 發送簡訊給我 |
[code sql] CREATE FUNCTION dbo.Date_TWtoUS (@twDate as varchar(10)) RETURNS Datetime AS BEGIN return Case When len(@twDate)=8 then Cast(Cast(Cast(left(@twDate,2) as int) 1911 as varchar(4)) right(@twDate,6) as Datetime) else Case when len(@twDate)=9 then Cast(Cast(Cast(left(@twDate,3) as int) 1911 as varchar(4)) right(@twDate,6) as Datetime) else Null end end END [/code] 當Select Date_TWtoUS('99.21.03)時,會出錯 不知SQL有無例外處理 ===================引 用 老大仔 文 章=================== 請問您SQL語法怎麼寫的??
------
一切都為了明天
編輯記錄
kuf41 重新編輯於 2010-06-08 16:33:35, 註解 無‧
|
老大仔
尊榮會員 發表:78 回覆:837 積分:1088 註冊:2006-07-06 發送簡訊給我 |
請再加以下的判斷試看看
PS: 以下沒經測試,因為我電腦目前沒有SQL,所以可能必須稍加修改一下囉 Sorry~ [code sql] Case When len(@twDate)=8 then if (CAST(substring(@twDate, 4, 2) as INT) > 12) then Null else Cast(Cast(Cast(left(@twDate,2) as int) 1911 as varchar(4)) right(@twDate,6) as Datetime) else Case when len(@twDate)=9 then if (CAST(substring(@twDate, 5, 2) as INT) > 12) then Null else Cast(Cast(Cast(left(@twDate,3) as int) 1911 as varchar(4)) right(@twDate,6) as Datetime) else Null [/code] ===================引 用 kuf41 文 章=================== [code sql] CREATE FUNCTION dbo.Date_TWtoUS (@twDate as varchar(10)) RETURNS Datetime AS? BEGIN ? return ?Case?When len(@twDate)=8 ??then Cast(Cast(Cast(left(@twDate,2) as int) 1911 as varchar(4)) right(@twDate,6) as Datetime) ??else?Case?when len(@twDate)=9 then Cast(Cast(Cast(left(@twDate,3) as int) 1911 as varchar(4)) right(@twDate,6) as Datetime) else Null ???end ?end END [/code] 當Select Date_TWtoUS('99.21.03)時,會出錯 不知SQL有無例外處理 ===================引 用 老大仔 文 章=================== 請問您SQL語法怎麼寫的?? ? ?
編輯記錄
老大仔 重新編輯於 2010-06-08 17:50:44, 註解 無‧
|
kuf41
中階會員 發表:14 回覆:45 積分:51 註冊:2006-12-03 發送簡訊給我 |
先謝謝你的熱心回應
以下語法可能不行(我沒試過),因為Cast(left(@twDate,2) as int)就會出錯了, 像Select Date_TWtoUS('91.?A.12'),不是數字 起因: 要把舊系統裡的民國日期資料轉換至新系統為Datetime模式 可是以前的資料有很多都不是民國格式.像 89.?A.12', ' . . '......等 所以; 要在做轉換時把這些都變成Null ===================引 用 老大仔 文 章=================== 請再加以下的判斷試看看 PS: 以下沒經測試,因為我電腦目前沒有SQL,所以可能必須稍加修改一下囉 Sorry~ [code sql] Case When len(@twDate)=8 then ? if (CAST(substring(@twDate, 4, 2) as INT) > 12) then Null ? else Cast(Cast(Cast(left(@twDate,2) as int) 1911 as varchar(4)) right(@twDate,6) as Datetime)?? ??? else Case when len(@twDate)=9 then ? if (CAST(substring(@twDate, 5, 2) as INT) > 12) then Null ? else ??? Cast(Cast(Cast(left(@twDate,3) as int) 1911 as varchar(4)) right(@twDate,6) as Datetime)?? ??? else Null [/code]
------
一切都為了明天 |
kuf41
中階會員 發表:14 回覆:45 積分:51 註冊:2006-12-03 發送簡訊給我 |
終於完成,以下為Function
[code sql] Create FUNCTION dbo.Date_TWtoUS (@twDate as varchar(10)) RETURNS Datetime AS BEGIN declare @shortDate as varchar(6) declare @value as datetime set @twDate=rTrim(lTrim(@twDate)) --長度為8 if len(@twDate)=8 begin set @shortDate=substring(@twDate,1,2) substring(@twDate,4,2) substring(@twDate,7,2) --判斷是否為數字,因小數點也是數字,要特別判斷 if (charindex('.',@shortDate)>0) or isnumeric(@shortDate)=0 set @value= Null else begin Set @twDate=Cast(Cast(substring(@shortDate,1,2) as int) 1911 as char(4)) right(@twDate,6) if isDate(@twDate)=1 set @value= Cast(@twDate as Datetime) else set @value= Null end end --長度為9 else if len(@twDate)=9 begin set @shortDate=substring(@twDate,1,3) substring(@twDate,5,2) substring(@twDate,8,2) --判斷是否為數字,因小數點也是數字,要特別判斷 if (charindex('.',@shortDate)>0) or isnumeric(@shortDate)=0 set @value= Null else begin Set @twDate=Cast(Cast(substring(@shortDate,1,3) as int) 1911 as char(4)) right(@twDate,6) if isDate(@twDate)=1 set @value= Cast(@twDate as Datetime) else set @value= Null end end --其他都Null else set @value= Null return @value END [/code]
------
一切都為了明天 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |