1

我有一列这样的日期和时间:

  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

我该如何克服这个问题?有人可以帮帮我吗?提前致谢!

4

2 回答 2

4

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

请注意,这是一个示例,不能直接应用于现有表。这是故意的。它是在 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

对于您的真实表格,再次假设表格中没有垃圾,您只需执行UPDATEandALTER部分(当然放入您的真实表格和列名而不是flooband splunge)。

SQLfiddle 示例

于 2013-07-26T17:28:43.413 回答
0

单程;

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

于 2013-07-26T17:37:08.917 回答