Search code examples
sqlsql-servert-sql

IsDate Function in SQL evaluates invalid dates as valid


I am running a SQL Statement against imported data from Excel Files. In this SQL I am checking if the users have entered dates properly by using IsDate function. Since this is a raw data that hasn't been converted yet, all dates are stored in a varchar data type field.

In some circumstances IsDate returns 1 (valid date) when there is clearly an incorrect date format entered by the user.

For Example:

07/001/2012

2012-07-002

007/002/2012

Any suggestions on how to handle this problem?

SELECT *
FROM tblImport
WHERE (ISDATE(dt) = 0 
    AND (dt is not null AND dt <> ''))

Solution

  • I do a lot of data conversion work and here is a function that I created and use it practically everyday to weed out the bad dates:

    CREATE FUNCTION dbo.fnCheckDate
    (@InDate nvarchar(50))
    RETURNS DATETIME
    AS
        BEGIN
            declare @Return DATETIME
    
            select @return = CASE WHEN ISDATE(@InDate) = 1
                                THEN CASE WHEN CAST(@InDate as DATETIME) BETWEEN '1/1/1901 12:00:00 AM' AND '6/6/2079 12:00:00 AM'
                                        THEN @InDate
                                        ELSE null
                                        END
                                ELSE null
                                END
            return @return
        END
    GO
    

    Results:

    SELECT dbo.fnCheckDate('07/001/2012') --> Returns 2012-07-01 00:00:00.000
    SELECT dbo.fnCheckDate('2012-07-002') --> Returns 2012-07-01 00:00:00.000
    SELECT dbo.fnCheckDate('007/002/2012') --> Returns 2012-07-01 00:00:00.000
    SELECT dbo.fnCheckDate('00/002/2012') --> Returns Null
    SELECT dbo.fnCheckDate('006/031/2012') --> Returns Null
    SELECT dbo.fnCheckDate('') --> Returns Null