線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:6412
推到 Plurk!
推到 Facebook!

民國日期轉換為西元語法

答題得分者是:老大仔
kuf41
中階會員


發表:14
回覆:45
積分:51
註冊:2006-12-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-06-08 10:18:25 IP:220.136.xxx.xxx 訂閱
民國換成西元的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
------
一切都為了明天
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-06-08 13:59:06 IP:59.120.xxx.xxx 未訂閱
僅供參考

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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-06-08 14:42:46 IP:220.136.xxx.xxx 訂閱
正確的民國格式是可以寫出來,

重點是一些錯誤的民國格式需回傳Null,

不知有何方法
------
一切都為了明天
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-06-08 16:12:41 IP:59.120.xxx.xxx 未訂閱
請問您SQL語法怎麼寫的??


===================引 用 kuf41 文 章===================
正確的民國格式是可以寫出來,

重點是一些錯誤的民國格式需回傳Null,

不知有何方法
kuf41
中階會員


發表:14
回覆:45
積分:51
註冊:2006-12-03

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-06-08 16:29:01 IP:220.136.xxx.xxx 訂閱

[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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2010-06-08 17:49:27 IP:59.120.xxx.xxx 未訂閱
請再加以下的判斷試看看

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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2010-06-08 18:04:09 IP:220.136.xxx.xxx 訂閱
先謝謝你的熱心回應

以下語法可能不行(我沒試過),因為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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2010-06-09 10:27:01 IP:220.136.xxx.xxx 訂閱
終於完成,以下為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]


------
一切都為了明天
系統時間:2024-04-19 4:40:02
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!