Попробовать / поймать в UDF невозможно? Как "TryCast" varchar на сегодняшний день? - PullRequest
2 голосов
/ 21 марта 2011

как я могу преобразовать параметр varchar в datetime, а если произойдет сбой приведения, используйте GetDate() по умолчанию? Я пытался поместить его в Try / Catch, но, видимо, это не работает в UDF. Это также не работает просто для проверки, является ли datetime нулевым, потому что это вызовет исключение («Преобразование типа данных char в тип данных datetime привело к значению datetime вне диапазона»):

CREATE FUNCTION [dbo].[getRZUInfo]
(
    @IMEI varchar(20),
    @StrDeliveryDate varchar(20)
)
RETURNS VARCHAR(8000)
AS
BEGIN
    DECLARE @Info VARCHAR(8000) 
    DECLARE @DeliveryDate datetime;
    SET @DeliveryDate = Convert(datetime,@StrDeliveryDate,102);
    IF @DeliveryDate IS NULL
        SET @DeliveryDate=GetDate();
    SELECT   @Info = COALESCE(@Info + '|', '') + 'TAT_B2B: ' + Convert(varchar,tabData.TAT_B2B) + ', AC' + Convert(varchar,tabData.fimaxActionCode) + ', Diff: ' + Convert(varchar,DateDiff(day,tabData.Received_date,@DeliveryDate))
        FROM   tabData
    WHERE     (SSN_Number = @IMEI) AND (Received_Date >= DATEADD(month, -3, @DeliveryDate))
    ORDER BY SSN_Number,Received_Date DESC
    return @Info
END

Ответы [ 3 ]

6 голосов
/ 21 марта 2011
SET @DeliveryDate = CASE
                      WHEN Isdate(@StrDeliveryDate) = 1 THEN
                      CONVERT(DATETIME, @StrDeliveryDate, 102)
                      ELSE Getdate()
                    END  
2 голосов
/ 21 марта 2011

Типичный недостаток 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.

0 голосов
/ 21 марта 2011

Просто проверяю, когда ноль

IF @StrDeliveryDate IS NULL
    SET @DeliveryDate = GetDate();
ELSE
    SET @DeliveryDate = Convert(datetime, @StrDeliveryDate, 102);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...