34,837
社区成员




CREATE TABLE table1
(
strField VARCHAR(30)
)
INSERT table1
SELECT CONVERT(VARCHAR(30), GETDATE()-1, 121) UNION ALL
SELECT '2011-1-32 00:00:01.001'
go
--SQL:
--原始SQL:
select * from
(select cast(v.strField as datetime) as dateField from
(select strField from table1 where isdate(strField)=1) v) w
where w.dateField < getdate()
--优化器优化后的SQL(自己看一下执行计划):
SELECT *
FROM ( SELECT CAST(v.strField AS DATETIME) AS dateField
FROM ( SELECT strField
FROM table1
WHERE ISDATE(strField) = 1
AND CONVERT(VARCHAR(30), strField, 121) < GETDATE() --因为条件为AND,所以每行都会执行这个对比,第2行转换时出错
) v
) w
--试试下面SQL:
select * from table1
WHERE GETDATE() > (CASE WHEN isdate(strField)=1 THEN CONVERT(VARCHAR(30), strField, 121) END)
/*
2011-04-13 08:36:32.993
*/