2017-10-16 59 views
2

表中和我们国家的到期日期='2017-10-16'和到期时间= '12:00pm'得分日期为'2017-10-16',currentdatetime为'2017-10-16 11:05:33,503'即使日期比较失败,为什么我的代码仍然执行IF块?

但仍然,我的代码执行它不应该的IF条件。为什么?

 Declare @ExpiryDate date 
     Declare @ExpiryTime varchar(10) 

     Set @ExpiryDate= (Select convert(varchar(11), ExpiryDate, 106) from Works where NIT_No= @NITNo and WorkNo= @WorkNo) 
     Set @ExpiryTime= (Select CAST(ExpiryTime as TIME(0)) from Works where NIT_No= @NITNo and WorkNo= @WorkNo) 

     IF(CONVERT(DATETIME,CONVERT(VARCHAR,@ExpiryDate,106)+ ' ' + @ExpiryTime) <= CONVERT(datetime, GETDATE())) 
     Begin 
      RAISERROR('Sorry, Expiry date and time has passed', 16, 10); 
      return; 
     End 
+2

为什么要使用转换代码'106'也为什么做VARCHAR和日期之间那么多的转换? –

+0

我对“下午12:00”感到困惑......我不知道这是2017年10月16日上午(0:00)还是2017年10月17日0:00 ...在第一种情况下,您的'IF' _is_'true'。 –

+0

这就是为什么你不使用字符串操纵日期! – Alex

回答

2

12:00 pm以24小时格式翻译成00:00。如果将当前日期和中午12点结合起来,则预计结果将是第二天的午夜,但实际上您可以获得当天的午夜。

这应该工作:

Declare @ExpiryDate date 
    Declare @ExpiryTime varchar(10) 

    Set @ExpiryDate= (Select convert(varchar(11), ExpiryDate, 106) from Works where NIT_No= @NITNo and WorkNo= @WorkNo) 
    Set @ExpiryTime= (Select CAST(ExpiryTime as TIME(0)) from Works where NIT_No= @NITNo and WorkNo= @WorkNo) 

    declare @dateTimeCombined datetime = dateadd(ms, datediff(ms, '00:00:00', @ExpiryTime), cast(@ExpiryDate as datetime)) 

    IF @dateTimeCombined <= CONVERT(datetime, GETDATE()) 
    Begin 
     RAISERROR('Sorry, Expiry date and time has passed', 16, 10); 
     return; 
    End 
相关问题