MySQL日期时间比较

时间:2012-07-25 10:25:28

标签: mysql datetime

这是我的问题:

我的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附近使用正确的语法。十二时11分43秒   AND date_to&lt; 2012.07.30。 12:11:46)或(date_from&gt; 2012.07.26.12:11:'at   第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 Name date_from date_to

1 test 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 to 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

7 个答案:

答案 0 :(得分:2)

您需要引用您的变量。

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

答案 1 :(得分:1)

我确定你需要用单引号括起日期:

date_from > '".$date_from."' AND

答案 2 :(得分:1)

您应将日期括在'".$date_from."'

等引号中

编辑:尝试:

$sql="SELECT * FROM presents WHERE '".$date_from."' BETWEEN date_from AND date_to";

答案 3 :(得分:1)

Date and Time Literals中所述:

  

MySQL会识别以下格式的DATETIMETIMESTAMP值:

     
      
  • 作为'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''070523091528'被解释为'2007-05-23 09:15:28',但'071122129015'是非法的(它具有无意义的分钟部分)并变为'0000-00-00 00:00:00'

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

  •   

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

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:0)

尝试使用其他语法,例如:

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

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

答案 6 :(得分: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时得到的内容 enter image description here

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