【问题标题】:Why does my code execute IF block even if dates comparison fail?即使日期比较失败,为什么我的代码也会执行 IF 块?
【发布时间】:2017-10-16 06:07:20
【问题描述】:

Expiry Date = '2017-10-16' and ExpiryTime='12:00pm' in table and in our country Getdate is '2017-10-16' and currentdatetime is '2017-10-16 11:05:33.503 '

但是,我的代码仍然执行它不应该执行的 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

【问题讨论】:

  • 您为什么使用转换代码106 以及为什么在 varchar 和 date 之间进行如此多的转换?
  • 我对 12:00pm 感到困惑...我不知道那是 2017-10-16 早上 (0:00) 还是 2017-10-17 0:00...in第一种情况,你的IF true.
  • 这就是为什么你不使用字符串来操作日期!

标签: sql sql-server sql-server-2008 tsql stored-procedures


【解决方案1】:

12:00pm 以 24 小时格式转换为 00:00。如果将当前日期和中午 12:00 结合起来,您希望结果是第二天的午夜,但实际上您得到的是当天的午夜。

应该可以的:

    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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多