如何在给定的两个日期之间选择行?

7

我正在尝试选择行,如果给定的日期仅在表中的两个日期之间,则可以选择。

在课程表中,我有开始日期和结束日期。

如果可能,我还需要在查询内部进行条件判断。

$coursneededdate >= startdate AND $coursneededdate <= enddate

这是我的代码,非常感谢您的帮助。

$coursneededdate = '2020-08-27';
$sql = "SELECT * FROM curriculum where ".$coursneededdate." between  'startdate' and 'enddate'";
$result = $mysqli->query($sql);
if ($result->num_rows > 0) {


    while($row = $result->fetch_assoc()) {

echo $row["curriculum_id"];


    }
}

3
你遇到了什么错误? - Tharif
引用变量时,它在传递给数据库时仍然是一个字符串。SELECT * FROM curriculum where '".$coursneededdate."' between 'startdate' and 'enddate' 如果仍然没有结果,请检查日期是否有5年后的课程。 - chris85
没有错误,查询没有保留任何内容。 - Hussain Almalki
带引号的结果是什么?你有在那个日期范围内的数据吗? - chris85
请检查更新后的答案,您在两个地方的引号都是错误的。 - chris85
显示剩余3条评论
4个回答

6
您的SQL语句如下:SELECT * FROM curriculum where '2020-08-27' between 'startdate' and 'enddate',其中包含所有字符串值但没有日期。

由于提供的参数起初为字符串,因此您需要使用STR_TO_DATE将其转换为日期值。表中的列名不应放在引号中。有时您会看到反引号用于指定列名。

您的查询应该类似于:

SELECT * FROM curriculum WHERE STR_TO_DATE('2020-08-27','%Y-%m-%d') BETWEEN `startdate` AND `enddate`;

重要提示

如果所提供的字符串日期值来自用户生成的输入,使用字符串连接创建SQL查询会使代码容易受到SQL注入攻击。


1
回答很好,但如果格式是标准的 MySQL 日期格式,则不需要使用STR_TO_DATE。 显然这样做仍然会得到一分赞 :) - Hanky Panky
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Hussain Almalki
1
@HussainAlmalki 是的,你可以这样做,但这就是BETWEEN语句已经为你做的事情 https://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_between - Dave Anderson
@Hanky 说得好。我本来想给你的回答点个赞,因为你提到了SQL注入,但现在它已经被删除了,所以我更新了这个答案。 - Dave Anderson

3
问题可能是您在将变量传递给数据库时没有引用该字符串变量。同时,不要引用列名。
$coursneededdate = '2020-08-27';
$sql = "SELECT * FROM curriculum where '".$coursneededdate."' between  startdate and enddate";
$result = $mysqli->query($sql);
if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
         echo $row["curriculum_id"];
    }
}

问题可能在于您正在检查未来五年的日期。您是否有那么远的数据?

它起作用了,谢谢,但我需要检查所有的开始和结束日期,以便获取在这些日期之间的所有数据。现在它只带来一行? - Hussain Almalki
我不确定这个问题,它应该返回那些日期范围内的所有记录。如果您在数据库上运行它,是有多个返回值吗?也许尝试删除 if ($result->num_rows > 0) { - chris85
非常感谢,它起作用了,我的错,我输入了一个日期,这个日期只在一行的起始日期和结束日期之间。我能否使用条件语句实现,例如$coursneededdate >= startdate AND $coursneededdate <= enddate? - Hussain Almalki
根据mysql文档和@Dave Anderson提供的链接,BETWEEN包括等于。如果表达式expr大于或等于min且小于或等于max,则BETWEEN返回1。 - chris85
太好了。感谢您提供的信息性帮助以及其他发表了优秀评论的人们。 - Hussain Almalki
显示剩余2条评论

0
尝试这个。
$sql = "SELECT * FROM curriculum where date = '" . $coursneededdate  . "' AND date between  '".$startdate."' and '" . $enddate . "'";

0

首先,您必须解决SQL问题,并确保您所编写的内容与SQL中预期的内容相同。

我建议使用echo $sql;查看查询是否对应于mysql,然后在数据库本身中运行它。

如果这样可以,那么我建议按照chris85所说的方法将您的值包装在单引号内:$sql = "SELECT * FROM curriculum where '".$coursneededdate."' between 'startdate' and 'enddate'";


我可以在查询中加入条件,例如 $coursneededdate >= startdate AND $coursneededdate <= enddate 吗? - Hussain Almalki
1
这就是 between 为你做的事情。但是,是的,请不要忘记给你的变量加上单引号,而且列名先于变量。@HussainAlmalki - azngunit81

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接