SQL is a squirrely language when it comes to string manipulation, but it has some nice functions. ISNUMERIC and ISDATE are two of them.
ISDATE does not work exactly as advertised in SQL Books Online, however. One feature not mentioned there is that any 4 digit string from '1753' to '9999' will be evaluated as a date (ISDATE interprets the number as a year, and valid years for datetime are 1753-9999). Unfortunately, CAST('1753' AS smalldatetime) will NOT work, as smalldatetime allows years only from 1900 through 2079.
In order to verify that a string input is indeed a 'small' date, I'd recommend the following function:
--Checks if a string is a valid smalldatetime
CREATE FUNCTION dbo.IsSmallDate
(
@SmallDateString varchar(20) --The input string to check
)
RETURNS BIT
AS
BEGIN
DECLARE @Result bit
IF ISNUMERIC(@SmallDateString) = 1
BEGIN
IF CAST(@SmallDateString AS int) BETWEEN 1900 AND 2079
SET @Result = 1
ELSE
SET @Result = 0
END
ELSE
SET @Result = ISDATE(@SmallDateString)
RETURN @Result
END
posted by Oskar Austegard at 7:58 AM on Apr 28, 2005
"SQL: ISDATE(@foo) and CAST(@foo AS smalldatetime)"
1 Comment -
See http://austegard.blogspot.com/2005/09/sql-updated-issmalldate-function.html for an updated function that does not depend on the faulty ISNUMERIC function.
Wednesday, September 21, 2005 2:48:00 PM