【问题标题】:IFNULL not working like I want toIFNULL 不能像我想的那样工作
【发布时间】:2015-05-16 11:30:13
【问题描述】:

我有两个可以为空的日期字段(PublishFrom、PublishTo)。 我正在尝试使用此查询获取记录:

SELECT * FROM tblNews 
    WHERE Publish = 1 
    AND IFNULL(PublishFrom, CURDATE() - INTERVAL 1 DAY) <= "2015-03-13" 
    AND IFNULL(PublishTo, CURDATE() + INTERVAL 1 DAY) >= "2015-03-13" 
    ORDER BY DateCreated DESC'

意思是如果这些字段(其中一个)的值为空,则将其替换为昨天和/明天的值,以便始终显示条目。

现在我只看到 PublishFrom 和/或 PublishTo 不为空的帖子。怎么会?

【问题讨论】:

    标签: mysql sql ifnull


    【解决方案1】:

    为什么不直接使用显式逻辑?

    SELECT *
    FROM tblNews 
    WHERE Publish = 1  AND
         (PublishFrom <= '2015-03-13' OR PublishFrom IS NULL) AND
         (PublishTo >= '2015-03-13' OR PublishTo IS NULL)
    ORDER BY DateCreated DESC
    

    【讨论】:

      【解决方案2】:

      使用CURDATE() + 1- 1 将转换CURDATE 并搞砸比较。 Instead use + INTERVAL 1 DAY (or - INTERVAL 1 DAY)

      【讨论】:

      • 这可行,但不能解决仅显示 PublishFrom 和/或 PublishTo 不为空的记录的问题
      • SELECT IFNULL(NULL, CURDATE() + INTERVAL 1 DAY) &gt;= "2015-03-13" AND IFNULL(NULL, CURDATE() - INTERVAL 1 DAY) &lt;= "2015-03-13" 返回TRUE 所以可能Publish 不等于1?或者也许我只是不明白你的问题
      • Publish 对于所有记录都等于 1。由于某种原因,此查询中 PublishFrom 和 PublishTo 为空的记录未被选中
      • 在 sqlfiddle 上完美运行,在我自己的 NAS 服务器和在线域上我得到一个空结果...
      • @BFlyDesign 可能与 MySQL 版本有关——确保它们相同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      相关资源
      最近更新 更多