在where子句中:仅当IsDate()为true时才将子字符串转换为日期

时间:2016-09-22 18:43:38

标签: sql-server

我正在尝试从表中删除超过6个月的所有行。

问题是使用varchar列中的子字符串抓取日期,并且它并不总是有效日期。

这里是失败的查询:

Delete ExampleDatesTable
 where CONVERT(datetime, SUBSTRING(DateField, LEN(DateField) - 18, 19)) < DATEADD(month, -6, GETDATE())

这是我想要做的,但它不起作用:

 Delete ExampleDatesTable
 where IsDate(SUBSTRING(DateField, LEN(DateField) - 18, 19)) = 1
 AND CONVERT(datetime, SUBSTRING(DateField, LEN(DateField) - 18, 19)) < DATEADD(month, -6, GETDATE())

有解决方法吗?

1 个答案:

答案 0 :(得分:1)

您可以先选择有效记录,然后根据日期删除。

WITH data AS (
    SELECT * FROM ExampleDatesTable
    WHERE ISDATE(SUBSTRING(DateField,LEN(DateField) - 18,19)) = 1
)
DELETE  data
WHERE   CONVERT(DATETIME,SUBSTRING(DateField,LEN(DateField) - 18,19)) < DATEADD(month,-6,GETDATE())