sql - 即使日期比较失败,为什么我的代码仍执行 IF block ?

标签 sql sql-server sql-server-2008 t-sql stored-procedures

表中的到期日期 = '2017-10-16' 且 ExpiryTime='12:00pm' 在我们的国家/地区 Getdate 为 '2017-10-16',当前日期时间为 '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

最佳答案

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

关于sql - 即使日期比较失败,为什么我的代码仍执行 IF block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46763876/

相关文章:

sql-server-2008 - SQL Server 2008-存储和搜索URL(网址)

sql - 查找分组值,然后连接行

sql - 用于收集和查询每个日期的文本统计信息的工具

PHP MS SQL ID格式问题

c# - SQL COUNT(Column) 也计算错误的空值

sql - 避免索引计划中的排序运算符

sql-server - 大型数据库的 SQL 统计

MySQL 解决错误 1093

sql - 时间刻度数据库/Postgres : INSERT ON CONFLICT KEEP MAXIMUM

sql-server - 在 BIML 中的数据流之前创建表