我在 varchar
中有一堆日期,如下所示:
20080107
20090101
20100405
...
如何将它们转换为这样的日期格式:
2008-01-07
2009-01-01
2010-04-05
我尝试过使用这个:
SELECT [FIRST_NAME]
,[MIDDLE_NAME]
,[LAST_NAME]
,cast([GRADUATION_DATE] as date)
FROM mydb
但收到此消息:
Msg 241, Level 16, State 1, Line 2
Conversion failed when converting date and/or time from character string.
最佳答案
发生错误是因为您(或设计此表的任何人)have a bunch of dates in VARCHAR
。为什么您(或设计此表的人)将日期存储为字符串?您(或设计此表的人)是否也将工资、价格和距离存储为字符串?
要查找导致问题的值(以便您(或设计此表的任何人)可以修复它们):
SELECT GRADUATION_DATE FROM mydb
WHERE ISDATE(GRADUATION_DATE) = 0;
打赌你至少有一行。修复这些值,然后修复表。或者询问设计 table 的人来修理 table 。确实不错。
ALTER TABLE mydb ALTER COLUMN GRADUATION_DATE DATE;
现在您不必担心格式问题 - 您始终可以将格式设置为 YYYYMMDD
或YYYY-MM-DD
在客户端上,或使用CONVERT
在 SQL 中。当您有一个有效日期作为字符串文字时,您可以使用:
SELECT CONVERT(CHAR(10), CONVERT(datetime, '20120101'), 120);
...但这最好在客户端上完成(如果有的话)。
有一个流行的术语——垃圾进,垃圾出。如果您的数据类型选择(或设计表的人的数据类型选择)本身就无法转换为日期(更不用说转换为特定格式的字符串)让垃圾进入你的 table 。请修复它。或者询问设计该表的人(再次,非常好)来修复它。
关于sql - 将 YYYYMMDD 转换为 DATE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15317321/