Типичный недостаток IsDate заключается в том, что он не может получить спецификатор формата даты, который может использовать CAST / CONVERT.
Смотрите это:
set dateformat dmy
declare @StrDeliveryDate varchar(20) set @StrDeliveryDate = '2011.12.13'
select CASE
WHEN Isdate(@StrDeliveryDate) = 1 THEN
CONVERT(DATETIME, @StrDeliveryDate, 102)
ELSE Getdate()
END
output: 2011-03-21 22:19:54.683
Это лучшая функция для тестирования дат в формате 102. На самом деле 102 намного проще, это достаточно гибко, чтобы подобрать гг / гггг, м / мм, д / дд.
create function dbo.Is102Date(@any varchar(50))
-- 102 = yyyy.mm.dd
returns bit as begin
set @any = ltrim(rtrim(@any))
declare @theyear varchar(10)
set @TheYear = case
when @any like '%[^0-9.]%' then null
when @any like '[0-9][0-9].%[0-9].%[0-9]' then
case when LEFT(@any,2) >=50
then '19'+LEFT(@any,2)
else '20'+LEFT(@any,2)
end
when @any like '[0-9][0-9][0-9][0-9].%[0-9].%[0-9]' then
LEFT(@any,4)
end
declare @YYYYMMDDToTest varchar(50)
set @YYYYMMDDToTest = case
when @TheYear is not null then
@TheYear
+ -- month
SUBSTRING(@any, charindex('.',@any) +1,
charindex('.',@any,charindex('.',@any)+1)-
charindex('.',@any)-1)
+ -- day
right(@any,charindex('.',reverse(@any))-1)
end
return ISDate(@YYYYMMDDToTest)
end
GO
Используйте его вместо ISDATE для проверки дат в формате 102 в varchar.