获取两个日期范围之间的记录


Fetching records between two date ranges

我想选择一个月内的所有记录。如:在数据库中,记录是日期

  1. 01/08/2014
  2. 02/08/2014
  3. 03/08/2014
  4. 04/08/2014
  5. 05/08/2014
  6. 14/08/2014
  7. 05/09/2014
  8. 16/09/2014

我想只选择01/08/2014到14/08/2014。我将查询写成

$result = mysql_query("SELECT t1.qty, t2.lastname, t2.firstname, t2.date, t3.name,      t2.reservation_id, t2.payable FROM prodinventory AS t1
INNER JOIN reservation AS t2
ON t1.confirmation=t2.confirmation
INNER JOIN products AS t3
ON t1.room=t3.id
WHERE t2.date BETWEEN '$start' AND date'$end'
GROUP BY t2.confirmation") or die(mysql_error());

我得到的结果是日期

  1. 01/08/2014
  2. 02/08/2014
  3. 03/08/2014
  4. 04/08/2014
  5. 05/08/2014
  6. 14/08/2014
  7. 05/09/2014

它包括九月的日期。请帮助。

像这样使用str_to_date函数:

SELECT t1.qty,
       t2.lastname,
       t2.firstname,
       t2.date,
       t3.name,
       t2.reservation_id,
       t2.payable
  FROM prodinventory AS t1
 INNER JOIN reservation AS t2
    ON t1.confirmation = t2.confirmation
 INNER JOIN products AS t3
    ON t1.room = t3.id
 WHERE str_to_date(t2.date, '%d/%m/%Y') BETWEEN
       str_to_date('$start', '%d/%m/%Y') AND
       str_to_date('$end', '%d/%m/%Y')

我还去掉了你的GROUP BY子句。只能将GROUP BY子句与聚合函数结合使用。您没有使用任何聚合函数。

当然,最理想的做法是修改表以实际保存日期,而不是字符串。这样就可以查询而不必转换。您还可以直接索引日期列,而不必创建基于函数的索引。

如果t2。Date是datetime,你的查询是这样的

(t2的地方。日期介于"2014-08-01 00:00:00"answers"2014-09-01"之间就是')

如果t2。日期是varchar或文本,你的查询是这样的

t2的地方。CAST('2014-08-01')与CAST('2014-09-01')之间的日期

日期);
WHERE t2.date BETWEEN '$start' AND date'$end'

这个date'$end'看起来不好。解决它。你的t2.date场是什么类型的?

更新:如果你只需要月份信息,那么你可以使用你的varchar字段LIKE '%/08/2014'条件。另一种方法是使用STR_TO_DATE(str,fmt),您的条件将是STR_TO_DATE(t2.date,'%d/%m/%Y') BETWEEN STR_TO_DATE('$start','%d/%m/%Y') AND STR_TO_DATE('$end','%d/%m/%Y')

一个简单的解决方案是使用LIKE操作符。

像"%/08/2014"

,

$result = mysql_query("SELECT t1.qty, t2.lastname, t2.firstname, t2.date, t3.name,      t2.reservation_id, t2.payable FROM prodinventory AS t1
INNER JOIN reservation AS t2
ON t1.confirmation=t2.confirmation
INNER JOIN products AS t3
ON t1.room=t3.id
WHERE t2.date LIKE '%/08/2014'
GROUP BY t2.confirmation") or die(mysql_error());

如果你没有改变MYSql的配置,日期格式应该是YYYY-MM-DD所以它会变成

像2014 - 08 - %的

希望有帮助!

快乐编码!!

这适用于我,如果"t2 "。date"字段是TIMESTAMP:

"... WHERE DATE(t2.date) BETWEEN '{$start}' AND '{$end}' "