Select 两个日期之间的行,其中日期是变量
Select rows between two dates where dates are variables
我在 php 中有一个 SELECT 语句,我需要 select table 的所有行,其中 "date" 列介于将由变量定义的开始日期和结束日期。
当我直接在 SELECT 语句中定义日期时,我可以正常工作,如下所示:
date BETWEEN "2015-02-03" AND "2015-02-05"
然而,当我尝试做同样的事情但使用变量时,它似乎不起作用:
date BETWEEN "$startdate" AND "$enddate"
在哪里
$startdate = "2015-02-03";
$enddate = "2015-02-05";
希望这一切有意义,提前干杯。
这里有完整的代码片段:
$startdate = "2015-02-03";
$enddate = "2015-02-05";
$sql = 'SELECT record_number, date, manmod, description, cal, serial, datein, dateout, retdate, refex, refexdate, sellersname, sellersaddress, buyersname, buyersaddress, rfddealer, del, warranty, months FROM record WHERE del="Live" AND date BETWEEN "$startdate" AND "$enddate" ORDER BY record_number DESC';
您应该将其转换为大于和小于方程式:
date > '$startdate' AND date < '$enddate'
来自PHP website:
Note: Unlike the double-quoted and heredoc syntaxes, variables and escape sequences for special characters will not be expanded when they occur in single quoted strings.
换句话说,由于您的查询用单引号引起来,因此 $startdate
和 $enddate
变量不会被解释为变量。发送到数据库的 SQL 查询字面上包含 $startdate
和 $enddate
,因此看起来像这样:
'SELECT column1, column2 FROM table WHERE date BETWEEN "$startdate" AND "$enddate" ORDER BY record_number DESC';
(为了便于阅读,我稍微简化了查询)
显然,数据库不知道如何解释 PHP 变量,它会查找日期介于这两个字符串之间的记录,但一无所获,因此 returns 0 条记录。
为了将变量的内容粘贴到您的 SQL 查询中,您必须执行以下两项操作之一:
选项 1:用双引号替换单引号
如果选择此选项,请确保转义现有的双引号,或将其更改为单引号:
$sql = "SELECT column1, column2 FROM table WHERE date BETWEEN '$startdate' AND '$enddate' ORDER BY record_number DESC";
选项 2:手动连接字符串
您还可以从多个部分手动构建查询,并使用 PHP 的连接运算符点 (.
).
将它们粘合在一起
$sql = 'SELECT column1, column2 FROM table WHERE date BETWEEN "' . $startdate . '" AND "' . $enddate;
问题不在于您的 SQL,而在于您的 PHP。
您需要阅读 string concatenation 的工作原理,以及 PHP 在环绕字符串时如何以不同方式处理使用 '
和 "
的字符串。
$sql = 'SELECT * FROM record WHERE date BETWEEN "$startdate" AND "$enddate"';
应更改为以下之一:
$sql = 'SELECT * FROM record WHERE date BETWEEN "' . $startdate . '" AND "' . $enddate . '"';
或:
$sql = "SELECT * FROM record WHERE date BETWEEN '$startdate' AND '$enddate'";
我简化了 SQL 以突出手头的实际问题。
我在 php 中有一个 SELECT 语句,我需要 select table 的所有行,其中 "date" 列介于将由变量定义的开始日期和结束日期。
当我直接在 SELECT 语句中定义日期时,我可以正常工作,如下所示:
date BETWEEN "2015-02-03" AND "2015-02-05"
然而,当我尝试做同样的事情但使用变量时,它似乎不起作用:
date BETWEEN "$startdate" AND "$enddate"
在哪里
$startdate = "2015-02-03";
$enddate = "2015-02-05";
希望这一切有意义,提前干杯。
这里有完整的代码片段:
$startdate = "2015-02-03";
$enddate = "2015-02-05";
$sql = 'SELECT record_number, date, manmod, description, cal, serial, datein, dateout, retdate, refex, refexdate, sellersname, sellersaddress, buyersname, buyersaddress, rfddealer, del, warranty, months FROM record WHERE del="Live" AND date BETWEEN "$startdate" AND "$enddate" ORDER BY record_number DESC';
您应该将其转换为大于和小于方程式:
date > '$startdate' AND date < '$enddate'
来自PHP website:
Note: Unlike the double-quoted and heredoc syntaxes, variables and escape sequences for special characters will not be expanded when they occur in single quoted strings.
换句话说,由于您的查询用单引号引起来,因此 $startdate
和 $enddate
变量不会被解释为变量。发送到数据库的 SQL 查询字面上包含 $startdate
和 $enddate
,因此看起来像这样:
'SELECT column1, column2 FROM table WHERE date BETWEEN "$startdate" AND "$enddate" ORDER BY record_number DESC';
(为了便于阅读,我稍微简化了查询)
显然,数据库不知道如何解释 PHP 变量,它会查找日期介于这两个字符串之间的记录,但一无所获,因此 returns 0 条记录。
为了将变量的内容粘贴到您的 SQL 查询中,您必须执行以下两项操作之一:
选项 1:用双引号替换单引号
如果选择此选项,请确保转义现有的双引号,或将其更改为单引号:
$sql = "SELECT column1, column2 FROM table WHERE date BETWEEN '$startdate' AND '$enddate' ORDER BY record_number DESC";
选项 2:手动连接字符串
您还可以从多个部分手动构建查询,并使用 PHP 的连接运算符点 (.
).
$sql = 'SELECT column1, column2 FROM table WHERE date BETWEEN "' . $startdate . '" AND "' . $enddate;
问题不在于您的 SQL,而在于您的 PHP。
您需要阅读 string concatenation 的工作原理,以及 PHP 在环绕字符串时如何以不同方式处理使用 '
和 "
的字符串。
$sql = 'SELECT * FROM record WHERE date BETWEEN "$startdate" AND "$enddate"';
应更改为以下之一:
$sql = 'SELECT * FROM record WHERE date BETWEEN "' . $startdate . '" AND "' . $enddate . '"';
或:
$sql = "SELECT * FROM record WHERE date BETWEEN '$startdate' AND '$enddate'";
我简化了 SQL 以突出手头的实际问题。