【问题标题】:MySQLUpdate - Set Field if date has not passedMySQL 更新 - 如果日期尚未过去,则设置字段
【发布时间】:2017-09-19 15:05:24
【问题描述】:

我有一个关于 MySQL 中关于根据字段中日期的可能性更新字段的 case/if 语句的问题。我有两个领域。一个包含日期(“LastDayToNotify”)和一个包含纯文本消息(“NotifyMessage”)

日期字段可以包含三个值之一 - 空字段、Null 或日期。

我的问题是 - 是否有可能,如果可以,如何在 MySQL 中根据日期 (LastDayToNotify) 是否已过设置一个字段的值 (NotifyMessage) 的查询?一个例子是:

如果日期尚未过去(日期是今天或之前),请更新 NotifyMessage 字段以显示“通用消息”

但如果日期字段为空、null 或已通过,则它什么也不做。

我在此线程中测试了几个答案修改,但无法成功解释所有 3 种可能的日期场景。 Here

我知道这可能是一个新手问题,但我从未遇到过这种特殊需求。

谢谢!

【问题讨论】:

    标签: php mysql sql


    【解决方案1】:

    我假设您使用的是健全的字段类型(datedatetime)...

    UPDATE table
    SET
        NotifyMessage = 'Generic Message'
    WHERE
        LastDayToNotify IS NOT NULL
        AND LastDayToNotify >= CURDATE();
    

    如果您尚未将日期存储为 date 类型,请查看:Converting a date in MySQL from string field

    【讨论】:

    • 不确定你想要<>= 的哪个方式 - 你的逻辑有点不清楚(“如果日期还没有过去(日期是今天还是之前”)
    • 我将数据存储在日期字段中,所以我认为我在那里很好。就逻辑而言-我可能说错了。 LastDayToNotify 是我们设置消息的最后一天。这意味着如果日期已过 - 我们将不再提供消息,但如果日期是今天或将来,我们将设置日期直到日期已过。
    【解决方案2】:

    根据我的经验,您不能使用 CASE 语句设置值,但您可以列出一些内容。但是,这将显示为单独的列。

    E.G

        CASE WHEN date < SELECT DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0)
        THEN "Generic Message"
        ELSE 0 
        END AS 'Before Today'
    

    然后您必须创建更多案例语句来涵盖其他场景,例如 NULL

    【讨论】:

      【解决方案3】:

      您可以使用这个简单的查询:

      UPDATE yourTable SET NotifyMessage = 'Generic Message'
      WHERE LastDayToNotify <= CURDATE();
      

      【讨论】:

      • 虽然这不是一个糟糕的答案,但如果您先解释一下为什么这样可以解决问题以及首先出了什么问题,则可以改进它。
      猜你喜欢
      • 2011-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-21
      • 2017-11-15
      • 1970-01-01
      • 2017-05-31
      • 2020-03-19
      相关资源
      最近更新 更多