我目前将日期存储在数据库的常规属性字段中作为字符串。
它们都以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包裹所以我只在数据集上用正确的数据做它。
任何帮助都会非常实用!非常感谢提前!!
答案 0 :(得分:0)
有几件事......
您无需转换为GETDATE()
至DATETIME data type
,因为它已经返回日期时间数据类型。
而不是CONVERT(DATETIME, attribute.field_value, 103)
使用
CONVERT(DATETIME, attribute.field_value)
或CAST(attribute.field_value AS DATETIME)
在select中添加where子句以仅获取有效的DATETIME
值。
WHERE ISDATE(attribute.field_value) = 1
这将过滤掉任何看似日期值的值,但sql server不会将它们视为有效日期值。
重要不是
使用适当的数据类型。如果此列存储日期值,为什么不使用DATE
或DATETIME
数据类型。
答案 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)