从托管实例中的字符串转换日期和/或时间时转换失败-为什么?

时间:2019-02-18 08:46:46

标签: sql-server database

我正在尝试在托管实例中执行以下查询。

SELECT
T.name
FROM sys.tables T
WHERE T.name NOT IN ('ElsevierExtracts')
AND CAST(RIGHT(T.name,6) AS DATE) < DATEADD(DAY,-8,GETDATE())
AND T.type = 'U'

它会引发如下错误:

  

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

该查询包含在Execute SQL任务的SSIS包中,但由于转换而出现错误。

2 个答案:

答案 0 :(得分:1)

使用TRY_CASTTRY_CONVERT代替普通的CAST

通过使用类似TRY_CONVERT(DATE, RIGHT(T.name,6) ) < DATEADD(DAY,-8,GETDATE())的条件,不会因表名不匹配而出错。

按如下所示更改查询。

SELECT
T.name   
FROM sys.tables T
WHERE T.name NOT IN ('ElsevierExtracts')
AND  TRY_CONVERT(DATE, RIGHT(T.name,6) ) < DATEADD(DAY,-8,GETDATE())
AND T.type = 'U'

Online Demo

答案 1 :(得分:0)

因为表的name列数据格式错误。

例如:

select CAST(RIGHT('xxxx',6) AS DATE);

它将得到Conversion failed when converting date and/or time from character string.

您必须确保数据格式如日期,如下所示:

select CAST(RIGHT('20190218',6) AS DATE); --Run Success

Online Demo db<>fiddle