Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP/PDO/MySQL if语句位于中间子句中_Php_Mysql_Sql_Date_Between - Fatal编程技术网

PHP/PDO/MySQL if语句位于中间子句中

PHP/PDO/MySQL if语句位于中间子句中,php,mysql,sql,date,between,Php,Mysql,Sql,Date,Between,我正在尝试返回某个日期范围内某个存储区的所有记录。但是,如果商店在日期之后开业,我想使用开业日期。有可能这样做吗?我将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 Q:有可能做这样的事情吗 A:是 当然,您需要删除i

我正在尝试返回某个日期范围内某个存储区的所有记录。但是,如果商店在日期之后开业,我想使用开业日期。有可能这样做吗?我将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

Q:有可能做这样的事情吗

A:

当然,您需要删除
if
前面的无关paren。没有结束语paren,即使有,在该上下文中,将该表达式包装在paren中也是不必要的

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

date BETWEEN IF(open_date > :start_date, open_date, :start_date_2) AND :end_date
                                                               ^^
代码需要为所有三个命名占位符绑定值

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

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

所以你可以这样做:

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

简单的回答:你为什么不试试呢?简单地用一些有效值创建一个查询并尝试自己运行它是很容易的。这样做可能比在此处键入问题并设置问题格式所花费的时间要少。您是否有理由相信在允许表达式的情况下,
IF()
表达式将无效?商店在其打开日期之前是否有记录?如果没有,则可以忽略开业日期,您只需使用开始日期即可。有些门店有我们存储的开业前派对,但不想包含在此报告中。如果
If
,则可以简化为
grest(:start\u date,open\u date)