【问题标题】:Convert VARCHAR to DATE in SQL SERVER在 SQL SERVER 中将 VARCHAR 转换为 DATE
【发布时间】:2017-09-13 09:17:28
【问题描述】:

我的表中有 VARCHAR 列 (MyValue)。它具有两种不同格式的日期值。

MyValue
----------
25-10-2016
2016-10-13

我想以 DATE 格式显示它们。

我写了如下查询:

SELECT CONVERT(date, MyValue, 105) FROM MyTable
SELECT CAST(MyValue as date) FROM MyTable

两者都给我这个错误。 Conversion failed when converting date and/or time from character string.

即使像上面那样以不同格式存储的值,是否也可以转换为 DATE 数据类型格式?

期待您的回答。提前致谢。

【问题讨论】:

  • 使用case 表达式根据日期格式进行适当的转换/转换。
  • 这两种格式只是示例。它也可以以任何其他格式存储。
  • 不要将日期存储为 varchar,因为这是个坏主意。为什么这是一个坏主意?好吧,看看你现在因为它而遇到的麻烦
  • @good-to-know,仍然是一个案例表达式。
  • @GuidoG,我认为 OP 现在已经吸取了教训,现在正在尝试清理混合日期。

标签: sql sql-server date sql-server-2012


【解决方案1】:

这有帮助吗?

declare @varchardates table
(
vcdate varchar(20)
)

INSERT INTO @varchardates VALUES
('25-10-2016'),
('2016-10-13')

SELECT CONVERT(date,vcdate, case when SUBSTRING(vcdate, 3, 1) = '-' 
THEN 105 ELSE 126 END) as mydate 
FROM @varchardates  

根据您的数据中有多少种不同的格式,您可能需要扩展 case 语句!

查看here了解不同格式编号的列表

【讨论】:

  • @good-to-know 检查我链接的页面。这显示了所有常见的格式编号。基本上,您只需要确保 case 语句选择您使用的所有格式。如果您允许多种格式,它可能会变得一团糟!
  • SQL Server 2012 具有 TRY_CONVERT、TRY_PARSE 方法,可以更轻松地尝试多种格式
【解决方案2】:

您可以使用TRY_CONVERTCOALESCETRY_CONVERT如果转换失败返回NULL,COALESCE返回第一个NOT NULL值:

SELECT  COALESCE(TRY_CONVERT(DATETIME, x, 105), TRY_CONVERT(DATETIME, x, 120))
FROM    (VALUES('25-10-2016'), ('2016-10-13')) a(x)

我假设值 2016-10-13 的格式为 yyyy-MM-dd

您在评论中提到您可能还有其他格式。在这种情况下,它变得非常棘手。如果您得到一个值 01-12-2017 并且您不知道格式,则无法判断这是一月还是十二月的日期。

【讨论】:

  • TRY_CONVERT是2012版引入的,COALESCE是2008版引入的;所以是的,它应该可以工作。
  • 因为它显示函数错误消息 195,级别 15,状态 10,第 1 行“TRY_CONVERT”不是可识别的内置函数名称。
  • @YogeshSharma 我目前没有要测试的 2012 安装。如果我将兼容性级别设置为 110,它仍然可以工作。如果我将它设置为 100 (2008 R2),它会因您提到的错误而失败。所以它应该工作......
  • 与 SQL Server 2012 不兼容! :-(
  • 我不知道为什么它不适合你(也许是兼容性问题),但它绝对应该work
猜你喜欢
  • 2010-11-26
  • 2020-03-11
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
相关资源
最近更新 更多