1

我有一列捕获时间(Char(30)):

2006-04-25T15:50:59.997000 PM

我想转换它并将其加载到日期时间中的其他表列中。无论是通过 T-sql 还是 SSIS 都可以。

我尝试过:

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

但它会产生一个错误:

从字符串转换日期和/或时间时转换失败

延迟更新:

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

29-JAN-10 08.57.41.000000 PM
4

4 回答 4

2

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

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

这是一种方法,但它非常难看。我强烈建议您修复 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;
于 2013-08-21T19:50:36.200 回答
0
select convert(datetime,left('2006-04-25T15:50:59.997000 PM',23))

或者

select convert(datetime,left(capturedatetime,23))
于 2013-08-21T19:50:05.800 回答
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
于 2013-08-21T19:50:58.783 回答
-1

如果你使用 cast,你甚至不需要提供格式。下面的代码片段在 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;

在此处输入图像描述


于 2013-08-21T19:56:52.477 回答