SQL - 将字符串转换为日期并进行比较 - 从字符串转换datetime时转换失败

时间:2015-03-04 11:37:23

标签: sql sql-server datetime

我目前将日期存储在数据库的常规属性字段中作为字符串。

它们都以DD/MM/YYYY格式存储,例如01/01/2000

我可以通过在datetime语句中使用以下内容将它们成功转换为select。例如CONVERT(DATETIME, attribute.field_value, 103)其中attribute.field_value包含日期。

SELECT语句正常工作,并正确返回整个表。

我还可以使用与CAST(getdate() AS datetime)

相同的格式返回包含今天日期的列

当我尝试比较时出现问题,现在我只想在dateNewerThanToday > dateToday

的伪代码中返回比今天更新的所有内容

因此我尝试过 WHERE CONVERT(DATETIME, attribute.field_value, 103) > CAST(getdate() AS datetime)

这给了我错误

Conversion failed when converting datetime from character string.

我尝试了大量的演员/转换来让它发挥作用。我也用select包裹所以我只在数据集上用正确的数据做它。

任何帮助都会非常实用!非常感谢提前!!

2 个答案:

答案 0 :(得分:0)

有几件事......

  1. 您无需转换为GETDATE()DATETIME data type,因为它已经返回日期时间数据类型。

  2. 而不是CONVERT(DATETIME, attribute.field_value, 103)

    使用

    CONVERT(DATETIME, attribute.field_value)CAST(attribute.field_value AS DATETIME)

  3. 在select中添加where子句以仅获取有效的DATETIME值。

    之类的东西

    WHERE ISDATE(attribute.field_value) = 1

    这将过滤掉任何看似日期值的值,但sql server不会将它们视为有效日期值。

  4. 重要不是

    使用适当的数据类型。如果此列存储日期值,为什么不使用DATEDATETIME数据类型。

答案 1 :(得分:0)

我遇到了这个确切的问题。

VARCHAR(50)中返回的SELECT列中的值可以转换为日期,而不会出现问题。但是,在WHERE子句中进行比较时,会发生错误。

值得注意的是,该错误仅在WHERE子句中有其他限制时发生。

当我将ISDATE()添加到WHERE子句时,该错误不再发生。

例如简短的例子:

    SELECT CONVERT(DATE, mat.myAttributeColumn), mdct.myDateComparisonColumn
    FROM myAttributeTable mat
    JOIN myDateComparisonTable mdct ON mdct.key = mat.key
    WHERE ISDATE(mat.myAttributeColumn) = 1
    and mdct.myDateComparisonColumn < convert(DATE, mat.myAttributeColumn)