【问题标题】:SQL Server - Value passes ISDATE() but fails to CAST as DATE or DATETIMESQL Server - 值通过 ISDATE() 但未能 CAST 为 DATE 或 DATETIME
【发布时间】:2019-06-08 19:42:53
【问题描述】:

我的数据库表中有一个varchar 列,在我想返回的行上,它填充为“2018-12-26T00:00:00.000”(引用我的,不包括在实际值中)。当我尝试在有效日期时查询此值时,例如

SELECT
    myValue
FROM 
    myTable
WHERE
    ISDATE(myValue) = 1

它正确返回。但是,我需要将此值转换为DATE。当我尝试这样的事情时:

SELECT
    CAST(myValue AS DATE) AS myValueFormatted
FROM 
    myTable
WHERE
    ISDATE(myValue) = 1

我收到一个错误

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

有没有其他方法可以将此varchar 值转换为Date

更新:我注意到通过尝试一些不同的事情,我在选择部分使用该值作为任何日期(DATEDIFFCONVERT 返回字符串等)的查询似乎没问题,但尝试在 WHERE 子句中对其执行任何操作会导致错误。为确保没有其他干扰,我创建了一个临时表,其中只有 1 行具有上述数据值,并且仅针对该值运行查询会给出错误

更新 2:好的,我不知道为什么会修复它,但这就是我发现的。当我跑步时

SELECT
    myValue
FROM
    myTable
WHERE
    TRY_CONVERT(DATE, myValue) IS NOT NULL

它返回的值与

完全相同
SELECT
    myValue
FROM 
    myTable
WHERE
    ISDATE(myValue) = 1

但是,当我将 AND CAST(myValue AS DATE) < GETDATE() 添加到每个 WHERE 子句时,只有第一个有效。我明白为什么 TRY_CONVERT 使用起来更安全,但我仍然不确定它为什么在 GETDATE() 上有效

【问题讨论】:

标签: sql sql-server casting type-conversion


【解决方案1】:

我无法重现您的错误...

declare @dt varchar(256) = '2018-12-26T00:00:00.000' select cast(@dt as date)

因此,其中一定有另一个无法转换的流氓值。

要确定在

SELECT
myValue
FROM myTable
WHERE
ISDATE(myValue) = 0

请注意,ISDATE 仅当您将其与 CONVERT 函数一起使用时,如果指定了 CONVERT 样式参数,并且样式不等于 0、100、9 或 109,则它是确定性的。

2012 年以后,请使用TRY_CONVERT

SELECT
*
FROM myTable
WHERE
TRY_CONVERT(date, myValue) IS NULL

【讨论】:

  • TRY_CONVERT 帮助我追踪发生了什么。谢谢!
  • ...实际上,虽然我确实找到了一个不稳定的值并将其删除,但它似乎仍然存在问题:(
  • 如果您运行第二个查询,您会发现有问题的 all 行。它只返回一个吗?
  • 删除无效的行后,查询不再返回行
  • 好的,您在解决问题后运行了哪个查询导致了问题?您能否将其与导致问题的示例数据一起添加到帖子中?
【解决方案2】:

你也可以试试这样的:

SELECT CAST(LEFT(MyValue, 10) AS DATE)

如果仍然无法正常工作,则您的数据存在一些格式问题。

【讨论】:

  • 不幸的是,它给出了与 where 子句中相同的错误,尽管它作为 SELECT 语句的一部分工作正常。我返回的唯一行是具有上述值的那一行
【解决方案3】:

这对我有帮助....

将字符串转换为 varchar(30),然后将 varchar 转换为 datetime2

CAST(CAST(REPLACE(['Timestamp' ],'''','') AS varchar(30)) as datetime2)

【讨论】:

  • 为什么我们需要更换任何东西?是不是日期时间?
猜你喜欢
  • 1970-01-01
  • 2015-12-28
  • 2012-10-14
  • 1970-01-01
  • 2016-07-26
  • 2017-04-19
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多