即使日期比较失败,为什么我的代码仍然执行IF块?
问题描述:
表中和我们国家的到期日期='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
答
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
为什么要使用转换代码'106'也为什么做VARCHAR和日期之间那么多的转换? –
我对“下午12:00”感到困惑......我不知道这是2017年10月16日上午(0:00)还是2017年10月17日0:00 ...在第一种情况下,您的'IF' _is_'true'。 –
这就是为什么你不使用字符串操纵日期! – Alex