【问题标题】:Which values are making the conversion from VARCHAR to DATE fail?哪些值导致从 VARCHAR 到 DATE 的转换失败?
【发布时间】:2019-03-15 15:03:56
【问题描述】:

我正在从键/值表中读取一个值,该值应包含一个 NULLABLE 日期,格式为 yyyy-MM-dd

查询的简化版本是。

SELECT CAST(ClaimDate AS DATE) AS ClaimDate
FROM MyTable

这会导致错误信息:

从字符转换日期和/或时间时转换失败 字符串。

我也试过CONVERT(DATE, ClaimDate),但无济于事。

现在,除了知道为什么会出现此错误之外,我还想知道是哪些值导致了此错误。

我已经看到关于上述错误消息的几个问题。但我还没有找到能回答我的问题的人。

当然,我们非常感谢您提出解决方案以及获取错误值的建议。

【问题讨论】:

  • 按 Claimdate 排序并确保所有值都大于公元 1754 年,在此之前的日期不会转换为日期时间。
  • “应该”并不意味着“可以”。使用TRY_CAST 查找哪些行包含无效条目
  • @RobertSievers 他们可以select cast('1400-01-01' as date) 工作
  • 您正在执行CAST(ClaimDate AS DATE) 的事实意味着您有一个“日期”列未将数据存储为date(time)。这是你的真正的问题。 varchar 不是一种适合所有数据类型的尺寸。您需要修复数据类型定义。
  • 尝试转换不合理的日期(例如 2 月 30 日)和其他原因时可能会发生这种情况。

标签: sql-server tsql date


【解决方案1】:

根据您的 SQL Server 版本(2012+),您可以使用TRY_CONVERT

SELECT ClaimDate 
FROM   MyTable
WHERE  TRY_CONVERT(DATE, ClaimDate ) IS NULL
    AND ClaimDate IS NOT NULL

这将为您提供无法转换为日期的值,您将如何解决这些问题是另一个问题。此外,2019-01-12 的值可能会被转换,但如果它在字符串中,则您无法确定这是 12 月还是 1 月的日期。您可能会得到有效但错误的日期!

【讨论】:

  • 太棒了!非常感谢!
  • 只要 Stack 允许我 ?,我就会接受作为答案。
  • @disasterkid 你确定吗?这些行包含什么?也许您在美国并且 DATEFORMAT 是 YMD,它会在 2019-03-14 上失败。忽略转换错误意味着您最终会得到 3 月 4 日而不是 4 月 3 日
【解决方案2】:

正如其他人解释的那样,真正的问题是使用 varchar 而不是 date 作为类型。这允许在字段中插入错误数据。解决这个问题可能是不可能的 - 如果在不同的行中有使用不同日期格式的字符串怎么办?

如果文本字段包含非日期字符串,CAST(ClaimDate AS DATE) 可能会失败。在这种情况下,可以使用以下命令忽略行:

SELECT ClaimDate AS ClaimDate
FROM MyTable
where TRY_CAST(ClaimDate as date) is not null

幸好类型是datedatetime 解析受DATEFORMAT 设置的影响。如果它设置为 YDM,这条线仍然可以工作:

set dateformat ydm;

select cast('2019-03-14' as date);

虽然这会抛出

set dateformat ydm;

select cast('2019-03-14' as datetime);

如果值为2019-03-04,情况会更糟。演员不会抛出,而是返回错误的日期。

幸运的是,来自 DATEFORMAT 的评论:

date、datetime2 和 datetimeoffset 数据类型不支持 DATEFORMAT ydm。

这就是为什么应该首先检查失败的数据

SELECT ClaimDate AS ClaimDate
FROM MyTable
where TRY_CAST(ClaimDate as date) is not null

如果一切正常,应该将类型更改为date,以确保不能插入错误的值

【讨论】:

    猜你喜欢
    • 2018-12-24
    • 2013-02-18
    • 1970-01-01
    • 2016-06-27
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    相关资源
    最近更新 更多