【问题标题】:PHP/PDO/MySQL if statement in BETWEEN clauseBETWEEN 子句中的 PHP/PDO/MySQL if 语句
【发布时间】:2013-08-07 16:17:14
【问题描述】:

我正在尝试返回特定日期范围内商店中的所有记录。但是,如果商店在该日期之后开业,我想使用开业日期。有可能做这样的事情吗?我将 PHP 与 PDO 和 MySQL 一起使用:

select
   store_name,
   daily_sales
from
   mytable
where
   date between (if(open_date > :start_date, open_date, :start_date) and :end_date

【问题讨论】:

  • 简单回答:你为什么不试试呢?简单地用一些有效值破解一个查询并尝试自己运行它很容易。与在此处输入和格式化问题相比,这样做可能花费您更少的时间。
  • 您有任何理由相信IF() 表达式在允许使用表达式的情况下无效?
  • 商店在营业日期之前会有记录吗?如果不是,可以忽略开放日期,您只需使用开始日期。
  • 一些商店有我们存储但不想包含在此报告中的开业前派对。
  • IF 可以简化为GREATEST(:start_date, open_date)

标签: php mysql sql date between


【解决方案1】:

所以你可以这样做:

select
   store_name,
   daily_sales
from
   mytable
where
   date between (select if(open_date > :start_date, open_date, :start_date)) and :end_date

【讨论】:

    【解决方案2】:

    问:可以做这样的事情吗?

    答:是的。

    当然,您需要从if 前面删除多余的括号。没有右括号,即使有,在这种情况下也不需要将该表达式包装在括号中。

    有一个潜在的问题需要注意。 PDO 文档对此没有明确说明,但我认为您不能在语句中多次使用命名绑定占位符。对于示例语句,您需要为占位符使用三个 不同的 名称,例如

    date BETWEEN IF(open_date > :start_date, open_date, :start_date_2) AND :end_date
                                                                   ^^
    

    代码需要为所有三个命名占位符绑定值。

    如果代码使用三个位置占位符,则类似于模式。

    date BETWEEN IF(open_date > ? , open_date, ?) AND ?
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-26
      • 2021-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-03
      • 2011-02-17
      • 2013-04-21
      相关资源
      最近更新 更多