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

丹青 2008-09-09 08:59:19
日期格式问题,如何把“20080101121212”(2008-01-01 12:12:12)格式的时间直接存入datetime字段中。在把平面源数据导入数据库时遇到了日期格式转换问题,用SSIS的“脚本任务”可以把“20080101121212”拆解成“2008-01-01 12:12:12” 格式后存入,但我的数据一千多万行,效率太低了,有没有类似SET DATEFORMAT 的办法。请大家帮忙,多谢。
...全文
246 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
sp4 2008-09-18
  • 打赏
  • 举报
回复
LZ的格式不是datetime的标准转换格式,只有凑着去解析了
丹青 2008-09-16
  • 打赏
  • 举报
回复
感谢大家的帮忙,我是想在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多万行呀,晕!!!!!!
再次谢谢大家,谁有好办法来发贴,也许这已经是好办法了,哈哈!!






蓝色木 2008-09-14
  • 打赏
  • 举报
回复
3楼的方法就可以
lff642 2008-09-12
  • 打赏
  • 举报
回复
分解一下.
crescens 2008-09-12
  • 打赏
  • 举报
回复
关注
丹青 2008-09-11
  • 打赏
  • 举报
回复
(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))用表达式快吗
guid6 2008-09-10
  • 打赏
  • 举报
回复
用9楼的函数最好吧,写一个函数直接在SELECT时调用就行了
-狙击手- 2008-09-09
  • 打赏
  • 举报
回复
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 行)
*/
rockyvan 2008-09-09
  • 打赏
  • 举报
回复
DATEFORMAT也必須是時間格式才行,用3樓方法吧!
hyqwan11112 2008-09-09
  • 打赏
  • 举报
回复
就像你自己说的在脚本任务中转一下吧!好像只有这样!
水族杰纶 2008-09-09
  • 打赏
  • 举报
回复
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 行受影响)
fcuandy 2008-09-09
  • 打赏
  • 举报
回复

declare @s varchar(20)
set @s='20080101121212'
select stuff(stuff(stuff(stuff(stuff(@s,5,0,'-'),8,0,'-'),11,0,' '),14,0,':'),17,0,':')
dawugui 2008-09-09
  • 打赏
  • 举报
回复
好象你这个只能按位分解.
dawugui 2008-09-09
  • 打赏
  • 举报
回复
按位分解
三下鱼 2008-09-09
  • 打赏
  • 举报
回复
[Quote=引用 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 行受影响)
[/Quote]
林虎 2008-09-09
  • 打赏
  • 举报
回复
SS ,其实日期部分可以不要加'-',所以3,4楼可以精减一下
青锋-SS 2008-09-09
  • 打赏
  • 举报
回复

用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 行受影响)

fzcheng 2008-09-09
  • 打赏
  • 举报
回复


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)

6,128

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 新技术前沿
社区管理员
  • 新技术前沿社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧