【发布时间】: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?
更新:我注意到通过尝试一些不同的事情,我在选择部分使用该值作为任何日期(DATEDIFF、CONVERT 返回字符串等)的查询似乎没问题,但尝试在 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() 上有效
【问题讨论】:
-
使用 TRY_CONVERT 找到确切的行,因为您可能有一些不可靠的数据。
标签: sql sql-server casting type-conversion