我正在开发一个系统,其中数据类型为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)
..等等。
当然,这不是一种万无一失的方式,因为有时可以存储日期和日期互换的日期。
感谢。
答案 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的文档。使用这样的格式适用于将日期时间转换为字符串,反之亦然。正如迈克尔·埃里克森的答案所示,拿一个字符串并将其转换为日期时间通常是正确的。