将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
我怎样才能解决这个问题?有人可以帮我吗?提前致谢!
这是一个可能的解决方案,假设您没有任何垃圾在这个列中无法正确转换(这是完全可能的,因为某些原因,您决定将日期存储为字符串)。
请注意,这是一个样本而不是你可以直接应用到你现有的表。这是有意的。它是在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
为了您的真正的表,再假设有表中没有垃圾,你只需做UPDATE
和ALTER
部分(您的真实表和列名的场推杆的floob
和splunge
代替)。
我不需要创建一个新表! :( – user2496503
@ 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)
如果这一天是d
或dd
。
你为什么要在一个字符串列中存储日期时间值?你也可以展示一下3月4日的样子吗?它是否具有领先的0或不是? –
其实我是从Excel文件导入数据,所以 – user2496503
好吧,那么为什么你的Excel文件有这样可怕的格式? –