2014-09-25 3 views
0

У меня есть таблица на SQL Server, в которой хранятся даты и независимо от того, являются ли они рабочим днем ​​или нет, включая праздничные дни.Проверьте, является ли вход varchar действительной датой

Date_Id  Date_Date Date_JDE Is_WorkingDay 
20141223 2014-12-23 114357  1 
20141224 2014-12-24 114358  1 
20141225 2014-12-25 114359  0 
20141226 2014-12-26 114360  0 
20141227 2014-12-27 114361  0 
20141228 2014-12-28 114362  0 
20141229 2014-12-29 114363  1 

Я создал хранимую процедуру, которая проходит через стол и находит дату, и если дата не является рабочим днем ​​он находит следующий, что есть.

DECLARE @TargetDate Date = '2014-12-29' 

IF (@TargetDate IS NOT NULL) 
    BEGIN 

     SELECT TOP 1 * 
     FROM dbo.Dates 
     WHERE Date_Date >= @TargetDate 
     AND Date_Date <= (SELECT MIN(Date_Date) 
          FROM dbo.Dates 
          WHERE Is_WorkingDay != 0 AND Date_Date >= @TargetDate) 
     ORDER BY Date_Date DESC 

    END 
ELSE 
    BEGIN 

     RAISERROR ('(TargetDate is required) is required ',10,1); 
     RETURN 

    END 

Как я могу подтвердить, что дата действительна, например, она находится в правильном формате и является реальной датой?

+0

Как вы думаете, что «Выберите строку, то не перебирать, пока условия выполнены» уместно описать ваше требование, которое на самом деле, кажется, : «Как проверить, является ли varchar допустимым дата-время»? –

+0

@TimSchmelter Извинения, изменено название вопроса. – user667430

+0

Вы не можете доверять, что даты в dbo.Dates действительны? У вас нет этой таблицы? Можете ли вы построить тот, который у вас есть и которому доверяете? –

ответ

1

Я переписал сценарий, попробуйте вместо этого:

DECLARE @TargetDate CHAR(10) = '2014-12-29' 

IF @TargetDate is NULL 
    SELECT '(TargetDate is null)' 
ELSE 
BEGIN TRY 
    SELECT MIN(Date_Date) 
    FROM dbo.Dates 
    WHERE 
    -- choose the format you need in convert. I used 126 which is isoformat 
    Date_Date >= convert(datetime, @TargetDate, 126) AND 
    Is_WorkingDay != 0 
END TRY 
BEGIN CATCH 
    SELECT '(TargetDate is invalid)' 
END CATCH 
1

Если вы знаете формат ввода. использование

SET DATEFORMAT format 

& Отдайте свой вклад даты и времени/даты внутри поймать блока в попробовать. Поднять ошибку, если она недействительна

Смежные вопросы