我有一个名为varchar(200)
的{{1}}列,我正在尝试将其转换为MM / DD / YYYY格式。当我这样做时,我收到以下错误:
Msg 242,Level 16,State 3,Line 1
将varchar数据类型转换为datetime数据类型导致超出范围的值。
该表的样本数据是:
Submit_Date
我尝试了以下内容:
Submit_Date
-----------------------
27-09-2013 16:15:00 CST
30-09-2013 16:30:24 CST
27-09-2013 10:03:46 CST
答案 0 :(得分:9)
你在这里承担了约15个关于日期/时间的主要罪行。首先,快速回答:
DECLARE @x VARCHAR(200);
SELECT @x = '27-09-2013 16:15:00 CST'
SELECT CONVERT(CHAR(10),CONVERT(DATETIME,LEFT(@x,10),105),101);
下一步:
为什么在varchar(200)
列中存储日期/时间数据?您知道任何人都可以在其中插入'09-27-2013'
或'465-32-207floob'
等值,对吗?如果您需要时区信息,可以查看DATETIMEOFFSET
数据类型(但请注意,它不支持DST)。
为什么要存储dd-mm-yyyy
等区域格式?如果第一个值是07-11-2013
,我必须猜测你是指7月11日还是11月7日。如果你不打算正确并使用正确的日期/时间数据类型,为什么使用字符串格式让人猜?使用明确无误的格式会更好,例如yyyy-mm-ddThh:mm:ssZ
。
同样,为什么要输出不同的区域格式,例如mm/dd/yyyy
?如果您输出'05/06/2013'
,您是否100%确信您的观众中的每个人都知道您的意思是5月6日而不是6月5日?您的输出也应该是明确的。如果您必须以某种区域和模糊格式进行格式化,请使用客户端的字符串格式化功能。例如,C#具有.ToString()
和.Format()
,它们在使用T-SQL的字符串格式呈现日期时更加强大和高效。