原贴http://community.csdn.net/Expert/topic/5180/5180183.xml?temp=.8988611函数功能是这样的:
将一个字符类型,记录的是日期,
比如 20061122090506121 表示 2006年11月22日 9点05分06秒121毫秒
现在就要把这个字符型的数据转换为日期:datetime型的数据
并且写成函数
叩谢!冒牌货的答案alter function fn_str2datetime (
@str varchar(30)
)
returns datetime
as
begin
if len(@str)<8 return null
if len(@str)=8 return left(@str,4)+'-'+substring(@str,5,2)+'-'+substring(@str,7,2)
if len(@str)<11 return left(@str,4)+'-'+substring(@str,5,2)+'-'+substring(@str,7,2)+' '+substring(@str,9,2)+':00:00'
if len(@str)<13 return left(@str,4)+'-'+substring(@str,5,2)+'-'+substring(@str,7,2)+' '+substring(@str,9,2)+':'+substring(@str,11,2)+':00'
return left(@str,4)+'-'+substring(@str,5,2)+'-'+substring(@str,7,2)+' '+substring(@str,9,2)+':'+substring(@str,11,2)+':'+substring(@str,13,2)
end
go
==================
这是我做的一个测试
declare @Str varchar(20)
set @Str = '20061120101020119'
select convert(datetime,
(
left(@str,4)+'-'+substring(@str,5,2)+'-'+substring(@str,7,2)+' '+substring(@str,9,2)+':'+substring(@str,11,2)+':'+substring(@str,13,2)+'.'+right(@str,3)
)
)返回结果2006-11-20 10:10:20.120问题来了
sqlserver在转换时产生了1毫秒的误差
请问如何解决?
将一个字符类型,记录的是日期,
比如 20061122090506121 表示 2006年11月22日 9点05分06秒121毫秒
现在就要把这个字符型的数据转换为日期:datetime型的数据
并且写成函数
叩谢!冒牌货的答案alter function fn_str2datetime (
@str varchar(30)
)
returns datetime
as
begin
if len(@str)<8 return null
if len(@str)=8 return left(@str,4)+'-'+substring(@str,5,2)+'-'+substring(@str,7,2)
if len(@str)<11 return left(@str,4)+'-'+substring(@str,5,2)+'-'+substring(@str,7,2)+' '+substring(@str,9,2)+':00:00'
if len(@str)<13 return left(@str,4)+'-'+substring(@str,5,2)+'-'+substring(@str,7,2)+' '+substring(@str,9,2)+':'+substring(@str,11,2)+':00'
return left(@str,4)+'-'+substring(@str,5,2)+'-'+substring(@str,7,2)+' '+substring(@str,9,2)+':'+substring(@str,11,2)+':'+substring(@str,13,2)
end
go
==================
这是我做的一个测试
declare @Str varchar(20)
set @Str = '20061120101020119'
select convert(datetime,
(
left(@str,4)+'-'+substring(@str,5,2)+'-'+substring(@str,7,2)+' '+substring(@str,9,2)+':'+substring(@str,11,2)+':'+substring(@str,13,2)+'.'+right(@str,3)
)
)返回结果2006-11-20 10:10:20.120问题来了
sqlserver在转换时产生了1毫秒的误差
请问如何解决?
alter function test_fun (
@a varchar(30)
)
returns datetime
as
begin
if len(@a)<8 return null
if len(@a)=8 return cast(@a as datetime)
if len(@a)<11 return cast(left(@a,8) as datetime)+(substring(@a,9,2)+':00:00')
if len(@a)<13 return cast(left(@a,8) as datetime)+(substring(@a,9,2)+':'+substring(@a,11,2)+':00')
if len(@a)<15 return cast(left(@a,8) as datetime)+(substring(@a,9,2)+':'+substring(@a,11,2)+':'+substring(@a,13,2))
return left(@a,4)+'-'+substring(@a,5,2)+'-'+substring(@a,7,2)+' '+substring(@a,9,2)+':'+substring(@a,11,2)+':'+substring(@a,13,2)+'.'
+convert(varchar,(cast(right(@a,3) as int)))
end
smalldatetime 精确到分钟
我做类型转换只是为了可以用sqlserver本身的一些日期函数
比如dateadd
现在有个不是办法的办法就是:
我的函数返回的值不为datetime,而为字符型或bigint型
这个函数只要能实现类似dateadd函数就可以了
SQL在做運算的時候,還是會先轉換成datetime型,也就是121還是看成120了
如:
select datediff(millisecond,'2006-11-11 11:11:11.120','2006-11-11 11:11:11.121')----
0
要麼把字串最後3位單獨抓出來做運算