我有一列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
答案 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;