将varchar转换为datetime的SQL Server 2008

问题描述:

我有日期和时间的这样一列:将varchar转换为datetime的SQL Server 2008

20/Mar/2013:02:28:47 
    20/Mar/2013:02:28:43 
    20/Mar/2013:02:28:47 
    20/Mar/2013:02:28:47 
    20/Mar/2013:02:28:47 
    20/Mar/2013:02:28:47 
    20/Mar/2013:02:28:41 
    20/Mar/2013:02:28:46 

此列的数据类型设置为“VARCHAR”。我只需要按照以下格式转换列到:

20/03/2013:02:28:47 
    20/03/2013:02:28:43 
    20/03/2013:02:28:47 
    20/03/2013:02:28:47 
    20/03/2013:02:28:47 
    20/03/2013:02:28:47 
    20/03/2013:02:28:41 
    20/03/2013:02:28:46 

也可以我改变它的数据类型从varchar到SQL日期和时间数据类型! 我与我的查询喜欢尝试:

SELECT convert(mydatetimecolumn,105) from mytable 

,但它给了我喜欢的结果:

1900-04-16 00:00:00.000 
    1900-04-16 00:00:00.000 
    1900-04-16 00:00:00.000 
    1900-04-16 00:00:00.000 
    1900-04-16 00:00:00.000 

我怎样才能解决这个问题?有人可以帮我吗?提前致谢!

+7

你为什么要在一个字符串列中存储日期时间值?你也可以展示一下3月4日的样子吗?它是否具有领先的0或不是? –

+0

其实我是从Excel文件导入数据,所以 – user2496503

+3

好吧,那么为什么你的Excel文件有这样可怕的格式? –

这是一个可能的解决方案,假设您没有任何垃圾在这个列中无法正确转换(这是完全可能的,因为某些原因,您决定将日期存储为字符串)。

请注意,这是一个样本而不是你可以直接应用到你现有的表。这是有意的。它是在tempdb中有意创建的,并且有虚构/无意义的表名,所以您可以尝试一下,而不是直接针对您的生产表尝试任何操作。因为,如果您针对真实表格运行更新会发生什么情况,并且它不像您期望的那样工作?你有备份吗?

USE tempdb; 
GO 

CREATE TABLE dbo.floob(splunge VARCHAR(32)); 

INSERT dbo.floob(splunge) VALUES('20/Mar/2013:02:28:47'),('4/Mar/2013:02:25:32'); 

UPDATE dbo.floob SET splunge = CONVERT(CHAR(8), 
    CONVERT(DATETIME, REPLACE(LEFT(splunge, 
    CHARINDEX(':', splunge)-1), '/', ' '), 13), 112) 
    + ' ' + RIGHT(splunge, 8); 

SELECT splunge FROM floob; 
GO 

SELECT CONVERT(DATETIME, splunge) FROM floob; 
GO 

ALTER TABLE dbo.floob ALTER COLUMN splunge DATETIME; 
GO 

SELECT splunge FROM floob; 
GO 

为了您的真正的表,再假设有表中没有垃圾,你只需做UPDATEALTER部分(您的真实表和列名的场推杆的floobsplunge代替)。

SQLfiddle example

+0

我不需要创建一个新表! :( – user2496503

+4

@ user2496503我知道这是一个* sample *,你可以自己尝试一下,并确保它可以正常工作,然后再对你的* real *表进行操作,但是你没有给我们真正的表或列无论如何,所以我不知道你为什么会期望一个解决方案,可以对付你的对象。 –

的一种方式;

declare @s varchar(32) = '20/Mar/2013:02:28:46' 

select cast(stuff(replace(@s, '/', ' '), 12, 1, ' ') as datetime) 

(No column name) 
2013-03-20 02:28:46.000 

使用

cast(stuff(replace(@s, '/', ' '), len(@s) - 8, 1, ' ') as datetime) 

如果这一天是ddd