Find invalid dates in SQL Server 2008
I have a 300.000 rows table; one of the columns is a varchar() but it really contains a date xx/xx/xxxx or x/x/xxxx or similar. But executing the following test yields an error:
SELECT CAST(MyDate as Datetime) FROM MyTable
The problem is that it doesn’t tell me in which row…
I have executed a series of “manual” updates by trial an error and performed simple updates to fix those, but there’s got to be some weird values that need to either be deleted or fixed.
For example I performed a simple test that fixed about 40 rows:
UPDATE MyTable SET MyDate = REPLACE(MyDate, '/000','/200') FROM MyTable WHERE MyDate like ('%/000%’)
UPDATE MyTable SET MyDate = REPLACE(MyDate, '/190','/199') FROM MyTable WHERE MyDate like ('%/190%’)
This fixed quite a few weird rows that had dates like 01/01/0003 and such. (Dates range from 1998 to 2010).
However, I’d like to know which rows are failing in the above select.
What would be the best way to print those so I can either delete them, edit开发者_如何学Python them or see what to do? Thanks.
SELECT
*
FROM
MyTable
WHERE
ISDATE(MyDate) = 0
Did you try the ISDATE
function?
Careful with IsDate. I have 1 bad record in a table of thousands. It says 8201-11-30 is a valid date. IsDate should have a YEAR limitation.
ISDATE doesn't seem to be working always.
the following returns 1 in SQL server 2008 R2
Select ISDATE('04- December 20')
But trying to cast the same value to date will fail.
Select cast('04- December 20' as date)
Conversion failed when converting date and/or time from character string.
精彩评论