Basically, you were getting lucky with bad code. You do not have control (mostly) over the order in which SQL will evalute your predicates. So, SQL 200 might have filtered out the rows based on A and B before evaluating C. Here is a sample:DECLARE @Yak TABLE (A VARCHAR(10), B VARCHAR(10), C VARCHAR(10))INSERT @YakSELECT 'A', 'B', '1/1/2008'UNION ALL SELECT 'A', 'B', '1/2/2008'UNION ALL SELECT 'C', 'C', 'foo'UNION ALL SELECT 'A', 'B', '1/3/2008'UNION ALL SELECT 'A', 'B', '1/15/2008'UNION ALL SELECT 'C', 'D', 'bar'UNION ALL SELECT 'A', 'B', '12/8/2008'SELECT *FROM @YakWHERE C >= '1/4/2008'-- FailsSELECT *FROM @YakWHERE C >= CAST('2008-01-02' AS DATETIME)SELECT *FROM @YakWHERE C >= CAST('2008-01-02' AS DATETIME) AND A = 'A' Using SQL 2005, you will notice that the first SELECT does not return what you might think it would, but it is correct:A B CC C fooC D barA B 12/8/2008
And the second select will just fail. And the third may or maynot work depending on the way SQL sets up the predicate. On my box it worked becasue it evaluated the A ='A' first. Here is predicate that was selceted by SQL: [A]='A' AND CONVERT_IMPLICIT(datetime,[C],0)>='2008-01-02 00:00:00.000'