SQL Server函数根据格式检查字符串并转换为日期

时间:2011-03-10 20:54:19

标签: sql-server datetime

我正在开发一个系统,其中数据类型为varchar的表列以不同格式存储日期作为字符串。例如:

12 Mar 2011
01/03/2011
2011/03/05
01/05/11
01/Mar/2010

问题的关键在于,由于该表由40多个不同的应用程序填充(其中一半甚至没有开始修改的源代码),我别无选择,只能继续工作数据可供我使用。

有没有人设计过一个函数来检查字符串在列中的存储方式,并根据需要将正确的转换应用到适当的日期时间数据类型?

Example below:
DateTime Value stored as String     |     SQL Convert Script
Dec 01 2010                               CONVERT(datetime, 'Dec 01 2010', 100)
10/23/2016                                CONVERT(datetime, '10/23/2016', 101
2016.10.23                                CONVERT(datetime, 2016.10.23, 102)

..等等。

当然,这不是一种万无一失的方式,因为有时可以存储日期和日期互换的日期。

感谢。

2 个答案:

答案 0 :(得分:2)

  

有没有人设计过一个函数来检查字符串在列中的存储方式,并根据需要将正确的转换应用到适当的日期时间数据类型?

是的,SQL Server可以做到这一点。

  

当然,这不是一种万无一失的方式,因为有时可以存储日期和日期互换的日期。

这是正确的。您必须通过指定最有可能的dateformat来帮助您。

set dateformat mdy
--set dateformat dmy

declare @T table (dt varchar(50))
insert into @T values
('12 Mar 2011'),
('01/03/2011'),
('2011/03/05'),
('01/05/11'),
('01/Mar/2010')

select cast(dt as datetime)
from @T

mdy

的结果
Date
-----------------------
2011-03-12 00:00:00.000
2011-01-03 00:00:00.000
2011-03-05 00:00:00.000
2011-01-05 00:00:00.000
2010-03-01 00:00:00.000

dmy

的结果
Date
-----------------------
2011-03-12 00:00:00.000
2011-03-01 00:00:00.000
2011-05-03 00:00:00.000
2011-05-01 00:00:00.000
2010-03-01 00:00:00.000

答案 1 :(得分:0)

我想你可能误解了CONVERT的文档。使用这样的格式适用于将日期时间转换为字符串,反之亦然。正如迈克尔·埃里克森的答案所示,拿一个字符串并将其转换为日期时间通常是正确的。