2014-09-25 54 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是否是一个有效的日期时间”? – 2014-09-25 13:37:07

+0

@TimSchmelter道歉,更改问题标题。 – user667430 2014-09-25 13:38:41

+0

您不能相信dbo.Dates中的日期有效吗?你不拥有那张桌子?你能建立一个你拥有并相信的吗? – 2014-09-25 13:40:04

回答

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 

&投下你输入的日期时间/日期尝试捕捉块内。提高一个错误,如果它是无效的