字符到日期时间转换

时间:2013-08-21 19:35:29

标签: sql sql-server sql-server-2008 tsql ssis

我有一列captureatetime(Char(30)):

2006-04-25T15:50:59.997000 PM

我想转换它并将其加载到DateTime中的其他表列。无论是通过T-sql还是SSIS,无论如何。

我尝试过:

select CONVERT(datetime, '2006-04-25T15:50:59.997000 PM', 126) 

但它会产生错误:

  

从字符串

转换日期和/或时间时转换失败

延迟更新:

在本专栏中,我还有其他格式完全不同的数据:

29-JAN-10 08.57.41.000000 PM

4 个答案:

答案 0 :(得分:2)

(1) 停止 在字符串列中存储日期时间数据!这没什么,没什么,只是麻烦。

(2)为什么你的专栏会以两种不同的字符串格式获取数据甚至无效?为什么字符串使用24小时时有AM / PM后缀?为什么要使用像29-JAN-10这样的区域字符串格式和Y2K灾难?

这是一种方式,但它非常难看。我强烈建议你修复SSIS进程,首先给你有效的日期时间值,如果不是作为日期时间,至少作为有效的ISO字符串(yyyy-mm-ddThh:mm:ss.nnn):

DECLARE @x TABLE (d CHAR(30));

INSERT @x SELECT '2006-04-25T15:50:59.997000 PM'
  UNION ALL SELECT '29-JAN-10 08.57.41.000000 PM';

SET LANGUAGE ENGLISH; -- this is important, else style 6 may not work

SELECT 
  CASE WHEN d LIKE '__[0-9]%' THEN 
    CONVERT(DATETIME, LEFT(d, 23))
  WHEN d LIKE '[0-9][0-9]-%' THEN
    CONVERT(DATETIME, CONVERT(CHAR(8),
    CONVERT(DATETIME,REPLACE(LEFT(d,9),' ','-'),6),112) 
    + ' ' + REPLACE(SUBSTRING(d,11,8),'.',':') 
    + ' ' + RIGHT(RTRIM(d),2))
  END
FROM @x;

答案 1 :(得分:0)

select convert(datetime,left('2006-04-25T15:50:59.997000 PM',23))

select convert(datetime,left(capturedatetime,23))

答案 2 :(得分:0)

126的转换不需要空格......我已经让它像这样工作:

declare @T varchar(50)
declare @dt datetime

set @T = '2006-04-25T15:50:59.997' 
set @dt = convert(datetime,@t,126)

select @T, @dt

答案 3 :(得分:-1)

如果您使用演员表,则甚至不需要提供格式。下面的代码片段在SQL 2012 Developer版本上进行了测试。

declare @var_string varchar(50) = '2006-04-25T15:50:59.997';
declare @var_datetime datetime = cast(@var_string as datetime);
select @var_string as my_string, @var_datetime as my_variable;

enter image description here