日期格式问题,如何把“20080101121212”格式的时间直接存入datetime字段中。 50Cool_Sword]

发布时间:2016-12-8 0:20:15 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"日期格式问题,如何把“20080101121212”格式的时间直接存入datetime字段中。 50Cool_Sword]",主要涉及到日期格式问题,如何把“20080101121212”格式的时间直接存入datetime字段中。 50Cool_Sword]方面的内容,对于日期格式问题,如何把“20080101121212”格式的时间直接存入datetime字段中。 50Cool_Sword]感兴趣的同学可以参考一下。

日期格式问题,如何把“20080101121212”(2008-01-01 12:12:12)格式的时间直接存入datetime字段中。在把平面源数据导入数据库时遇到了日期格式转换问题,用SSIS的“脚本任务”可以把“20080101121212”拆解成“2008-01-01 12:12:12” 格式后存入,但我的数据一千多万行,效率太低了,有没有类似SET DATEFORMAT 的办法。请大家帮忙,多谢。

按位分解

好象你这个只能按位分解.

declare @s varchar(20) set @s='20080101121212' select stuff(stuff(stuff(stuff(stuff(@s,5,0,'-'),8,0,'-'),11,0,' '),14,0,':'),17,0,':')

declare @s varchar(20) set @s='20080101121212' select substring(@s,1,4)+'-'+substring(@s,5,2)+'-'+substring(@s,7,2)+' '+substring(@s,9,2) +':'+substring(@s,11,2)+':'+substring(@s,13,2) --------------------------------- 2008-01-01 12:12:12 (1 行受影响)

就像你自己说的在脚本任务中转一下吧!好像只有这样!

DATEFORMAT也必須是時間格式才行,用3樓方法吧!

declare @s varchar(20) set @s='20080101121212' select cast( stuff( stuff(stuff(@s,9,0,' '),12,0,':'),15,0,':') as datetime) /* ------------------------------------------------------  2008-01-01 12:12:12.000 (所影响的行数为 1 行) */

DECLARE @s NVARCHAR(20),@stDate DATETIME SET @s='20080101121212' SELECT CAST((SUBSTRING(@s,1,4)+'-'+SUBSTRING(@s,5,2)+'-'+SUBSTRING(@s,7,2)+' '+              SUBSTRING(@s,9,2)+':'+SUBSTRING(@s,11,2)+':'+SUBSTRING(@s,13,2))AS DATETIME) ------------------------------------------------------  2008-01-01 12:12:12.000 (1 row(s) affected)

用3楼或者4楼的方法写个函数,直接调用这个函数即可. create function f_2date(@s varchar(20)) returns datetime as begin declare @rtn datetime set @rtn=cast( stuff( stuff(stuff(@s,9,0,' '),12,0,':'),15,0,':') as datetime) return @rtn end go select dbo.f_2date('20080101121212') go drop function f_2date go ----------------------- 2008-01-01 12:12:12.000 (1 行受影响)

SS ,其实日期部分可以不要加'-',所以3,4楼可以精减一下

引用 4 楼 wufeng4552 的回复:declare @s varchar(20)  set @s='20080101121212'  select substring(@s,1,4)+'-'+substring(@s,5,2)+'-'+substring(@s,7,2)+' '+substring(@s,9,2)  +':'+substring(@s,11,2)+':'+substring(@s,13,2)  ---------------------------------  2008-01-01 12:12:12  (1 行受影响) 

用9楼的函数最好吧,写一个函数直接在SELECT时调用就行了

(DT_DATE)(SUBSTRING(StrDate,1,4) + "-" + SUBSTRING(StrDate,5,2) + "-" + SUBSTRING(StrDate,7,2) + " " + SUBSTRING(StrDate,9,2) + ":" + SUBSTRING(StrDate,11,2) + ":" + SUBSTRING(StrDate,13,2))用表达式快吗

关注

分解一下.

3楼的方法就可以

感谢大家的帮忙,我是想在SSIS中导入数据时解决格式转换的问题,SSIS中的“快速分析”支持很多时间格式的转换,但就是 不支这种格式“20080101121212”,至今还没有好办法,只好写语句来处理了。我自己用二种方法来做的转换,现发布出来, 与大家共勉。 测试环境:PC机   双核1.8G   内存2G 测试数据:平面源数据:727万行,28列。其中,有二个日期类型(20080101121212)的字段需要转换成datetime存入数据库。 方法一      数据流--数据流转换--脚本组件。      脚本内容如下:         '状态时间ZTSJ         'Row.ZTSJ类型必须为numeric (14,0)          Dim StrZTSJ As String         StrZTSJ = Format(Row.ZTSJ, "0000-00-00 00:00:00")         If IsDate(StrZTSJ) Then             Row.ZTSJ2 = CDate(StrZTSJ)         Else             Row.ZTSJ2 = CDate("1900-1-1 00:00:00.000")         End If         'CJSJ 创建时间         Dim StrCJSJ As String         StrCJSJ = Format(Row.CJSJ, "0000-00-00 00:00:00")         If IsDate(StrCJSJ) Then             Row.CJSJ2 = CDate(StrCJSJ)         Else             Row.CJSJ2 = CDate("1900-1-1 00:00:00.000")         End If   测试结果是用时94分钟 方法二      数据流--数据流转换--派生列。      派生表达式如下: (DT_DBTIMESTAMP)(SUBSTRING(ZTSJ,1,4) + "-" + SUBSTRING(ZTSJ,5,2) + "-" + SUBSTRING(ZTSJ,7,2) + " " + SUBSTRING(ZTSJ,9,2) + ":" + SUBSTRING(ZTSJ,11,2) + ":" + SUBSTRING(ZTSJ,13,2)) (DT_DBTIMESTAMP)(SUBSTRING(CJSJ,1,4) + "-" + SUBSTRING(CJSJ,5,2) + "-" + SUBSTRING(CJSJ,7,2) + " " + SUBSTRING(CJSJ,9,2) + ":" + SUBSTRING(CJSJ,11,2) + ":" + SUBSTRING(CJSJ,13,2))   测试结果是用时94分钟 方法三,只是测试用,没有对二个日期列做转换,而是丢弃掉,输入的是NULL值    测试结果是用时92分钟 总结:从上面的二种方法来看,转换效率是一样的,都是用时94分钟,我最后用的是“脚本组件”,比较灵活。 最让我纳闷的是,不做日期转换的测试,仅比转换快了2分钟??!!!毕定要多运行一部份语句呀!!每一行都要运行, 那可是700多万行呀,晕!!!!!! 再次谢谢大家,谁有好办法来发贴,也许这已经是好办法了,哈哈!!

LZ的格式不是datetime的标准转换格式,只有凑着去解析了

上一篇:谁在WINDOWS2008装过SQL2008+VS2008+TFS2008? 0r_swordsman]
下一篇:"使用分号结束 Transact-SQL 语句", 你准备好了吗? 0zjcxc]

相关文章

相关评论