SQL Server-值通过ISDATE(),但无法在DATE或DATETIME进行CAST

时间:2019-01-14 19:28:36

标签: sql sql-server casting type-conversion

我的数据库表中有一个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返回字符串等)的日期,查询对我来说似乎很好。在select部分中,但是尝试在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()上使用

3 个答案:

答案 0 :(得分:2)

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

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

因此,那里必须有另一个无法转换的无赖值。

要确定导致什么原因导致版本<2012上的问题,请运行以下命令:

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

答案 1 :(得分:0)

您也可以尝试以下操作:

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

如果仍然无法使用,则说明您的数据存在一些格式化问题。

答案 2 :(得分:0)

这对我有帮助....

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

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