【问题标题】:Value if condition is met in SQLSQL 中满足条件时的值
【发布时间】:2021-11-28 17:27:57
【问题描述】:

在 SQL Server 中,如何在给定条件的情况下影响属性的值,并每天检查条件?

假设在某个日期记录了订单。根据我的业务规则,应在订单日期后的 10 天内交货。

在我的 Delivery 表中,我有一个 status 属性。

在我的 Order 表中,我有一个 orderDate 属性。

我希望根据以下逻辑设置status 值:

if deliveryDate is null:
     if today's date < orderDate + 10:
          'in progress'
     else : 
          'late'
else :
     if deliveryDate > orderDate + 10:
          'late'
     else:
          'on time'

我有什么办法可以做到这一点,并每天更新status 值以再次检查订单是否迟到?

【问题讨论】:

  • 请阅读 S.O.指导方针。
  • 提问时,您需要提供minimal reproducible example: (1) DDL 和样本数据填充,即 CREATE 表和 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试在 T-SQL 中实现它。 (3) 期望的输出,基于上述#1 中的样本数据。 (4) 您的 SQL Server 版本 (SELECT @@version;)。
  • 时间的流逝不会改变一列的内容。如果它是纯可视的,您可以为此目的使用视图或计算列。更改值的定期作业(提示)是另一种可能性。但我建议您考虑一个更精确的业务流程,以某种方式“提醒”那些“迟到”的交付

标签: sql sql-server date auto-update


【解决方案1】:

使用case/when 语句。


-- if deliveryDate is null: 
--   if today's date < orderDate + 10: 
--     'in progress' 
--   else : 
--     'late' 
-- else : 
--   if deliveryDate > orderDate + 10: 
--     'late' else: 'on time'
    select
    case
    when tableName.deliveryDate is null 
        case 
        when datetimeutc() <= dateadd(tableName.orderDate, 10, 'dd')
            then 'in progress'
        else 'late'
        end
     else 
         case 
         when tableName.deliveryDate > dateadd(tableName.orderDate, 10, 'dd')
             then 'late'
         else 'on time'
         end
      end

     as "Status"
     from -- ...

T-SQL case/whenif .. then return ... elif ... then return ... else return ... endif 的直接翻译

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-21
    • 2022-10-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    相关资源
    最近更新 更多