sql - 将 YYYYMMDD 转换为 DATE

标签 sql sql-server sql-server-2008-r2

我在 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;

现在您不必担心格式问题 - 您始终可以将格式设置为 YYYYMMDDYYYY-MM-DD在客户端上,或使用CONVERT在 SQL 中。当您有一个有效日期作为字符串文字时,您可以使用:

SELECT CONVERT(CHAR(10), CONVERT(datetime, '20120101'), 120);

...但这最好在客户端上完成(如果有的话)。

有一个流行的术语——垃圾进,垃圾出。如果您的数据类型选择(或设计表的人的数据类型选择)本身就无法转换为日期(更不用说转换为特定格式的字符串)让垃圾进入你的 table 。请修复它。或者询问设计该表的人(再次,非常好)来修复它。

关于sql - 将 YYYYMMDD 转换为 DATE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15317321/

相关文章:

mysql - 如何优化我在 Mysql 中连接两个表的查询

sql - 查找前两个日期点之间的天数

mysql - 在 SQL 中具有特定条件的字符串开头添加前导零

xml - SQL Server XML 分解性能

sql-server-2008-r2 - Sql server 中的 FLWOR 计数命中数

javascript - 如何从 SQL where 子句创建 JavaScript 函数,并将其作为谓词传递到 JavaScript 数组的过滤函数中?

sql - 选择查询返回列包含域名的所有行

ruby-on-rails - 带有 Rails 的 SQL 服务器

sql-server - 从表变量更新表

sql-server - SQL Server : splitting the results of GROUP BY into a separate columns