1

这是我的问题:

我的 mysql 数据库中有一个表,其中包含一些产品,它有两列称为“date_from”和“date_to”,它们确定产品处于活动状态的时间段。

在我的网站上有一个表单,管理员可以在其中选择两个日期时间值,如果产品的活动期与管理员选择的跨度相交,则页面会更新产品列表。

这是我的查询,我用它来实现我想要的:

$sql="SELECT * FROM presents WHERE (date_from>".$date_from." AND date_to<".$date_to.") OR (date_from>".$date_from." AND date_to>".$date_to.") OR (date_from<".$date_from." AND date_to>".$date_to.") OR (date_from<".$date_from." AND date_to<".$date_to.")";

我得到了这个错误:

mysql说:My​​Sql错误号:1064 MySql错误说明:你的SQL语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 '.26 附近使用的正确语法。12:11:43 和 date_to<2012.07.30。12:11:46) 或 (date_from>2012.07.26. 12:11:' 在第 1 行

有任何想法吗?

*编辑

我按照建议更改了查询,并为变量添加了单引号。现在我没有收到错误,但查询似乎没有做它应该做的 - 产品列表保持不变......现在是查询:

$sql="SELECT * FROM presents WHERE (date_from>'".$date_from."' AND date_to<'".$date_to."') OR (date_from>'".$date_from."' AND date_to>'".$date_to."') OR (date_from<'".$date_from."' AND date_to>'".$date_to."') OR (date_from<'".$date_from."' AND date_to<'".$date_to."')";

假设我的表中有这一行:

ID 名称 date_from date_to

1 次测试 2012-07-24 16:40:00 2012-07-31 16:40:00


我需要所有这些时间段来返回该行:

2012-07-23 16:40:00 至 2012-08-01 16:40:00

2012-07-23 16:40:00 至 2012-07-28 16:40:00

2012-07-26 16:40:00 至 2012-07-28 16:40:00

2012-07-26 16:40:00 至 2012-08-01 16:40:00

4

7 回答 7

2

你需要引用你的变量。

但是最好不要连接sql,而是使用占位符。

于 2012-07-25T10:27:27.420 回答
1

我确定您需要将日期用单引号括起来:

date_from > '".$date_from."' AND
于 2012-07-25T10:27:28.167 回答
1

您应该用引号将日期括起来,例如'".$date_from."'

编辑:尝试:

$sql="SELECT * FROM presents WHERE '".$date_from."' BETWEEN date_from AND date_to";
于 2012-07-25T10:27:32.460 回答
1

日期和时间文字中所述:

MySQL以这些格式识别DATETIME和重视:TIMESTAMP

  • 作为一个'YYYY-MM-DD HH:MM:SS''YY-MM-DD HH:MM:SS'格式的字符串。这里也允许使用“宽松”的语法:任何标点符号都可以用作日期部分或时间部分之间的分隔符。例如,'2012-12-31 11:30:45''2012^12^31 11+30+45''2012/12/31 11*30*45''2012@12@31 11^30^45'是等价的。

  • 作为在任何一种格式中都没有分隔符的'YYYYMMDDHHMMSS'字符串'YYMMDDHHMMSS',前提是该字符串作为日期有意义。例如,'20070523091528'and'070523091528'被解释为'2007-05-23 09:15:28', 但是'071122129015'是非法的(它有一个无意义的微小部分)并且变成'0000-00-00 00:00:00'.

  • 作为任一YYYYMMDDHHMMSS格式YYMMDDHHMMSS的数字,前提是该数字作为日期有意义。例如19830905132800830905132800被解释为'1983-09-05 13:28:00'

如果您使用的是字符串格式,则必须确保正确引用您的字符串。

于 2012-07-25T10:28:57.793 回答
1

您以 的形式传递日期时间string,因此您需要像这样用单引号字符引用它们:

... (date_from<'".$date_from."' AND date_to>'".$date_to."') ...

或者,您可以将您使用的变量的格式更改为数字(YYYYMMDDHHmmss形式),然后不需要引用

于 2012-07-25T10:29:54.827 回答
0

尝试使用另一种语法,更像:

WHERE OrderDate BETWEEN '01/01/2006' AND '01/02/2006'

来源: http: //www.demiliani.com/blog/archive/2006/01/19/3384.aspx

于 2012-07-25T10:28:59.073 回答
0

这是为您提供的完整版 SQL :)。我已经用你提到的字段创建了测试表,这个 SQL 对我来说运行完美——

$sql="SELECT * FROM presents WHERE (date_from > STR_TO_DATE('".$date_from."', '%Y-%m-%d %H:%i:%s') AND date_to < STR_TO_DATE('".$date_to."', '%Y-%m-%d %H:%i:%s')) OR (date_from > STR_TO_DATE('".$date_from."', '%Y-%m-%d %H:%i:%s') AND date_to >  STR_TO_DATE('".$date_to."', '%Y-%m-%d %H:%i:%s') ) OR (date_from < STR_TO_DATE('".$date_from."', '%Y-%m-%d %H:%i:%s') AND date_to > STR_TO_DATE('".$date_to."', '%Y-%m-%d %H:%i:%s')) OR (date_from < STR_TO_DATE('".$date_from."', '%Y-%m-%d %H:%i:%s') AND date_to <STR_TO_DATE('".$date_to."', '%Y-%m-%d %H:%i:%s'))";

附上我在 phpMyAdmin 中运行 SQL 时得到的结果- 在此处输入图像描述

如果您遇到任何问题,请告诉我。

于 2014-01-29T07:45:57.277 回答