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

时间:2014-08-02 15:11:07

标签: php mysql sql date

我想在一个月内选择所有记录。 例如: 在datebase中的记录是 日期

  1. 2014年1月8日
  2. 2014年2月8日
  3. 2014年3月8日
  4. 2014年4月8日
  5. 2014年5月8日
  6. 14/08/2014
  7. 2014年5月9日
  8. 16/09/2014
  9. 关于我,我只想选择2014年8月1日至2014年8月14日。 我把查询写成

    $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. 2014年1月8日
    2. 2014年2月8日
    3. 2014年3月8日
    4. 2014年4月8日
    5. 2014年5月8日
    6. 14/08/2014
    7. 2014年5月9日
    8. 它包括9月份的日期。请帮忙。

5 个答案:

答案 0 :(得分:3)

使用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子句与聚合函数结合使用。您没有使用任何聚合函数。

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

答案 1 :(得分:2)

WHERE t2.date BETWEEN '$start' AND date'$end'

date'$end'看起来不太好。修理它。您的t2.date字段是什么类型的?

更新:如果您只需要月份信息,那么您可以使用具有LIKE'%/ 08/2014'条件的varchar字段。另一种方法是使用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')

答案 2 :(得分:2)

如果t2.date的类型是datetime,则查询看起来像这样

  

WHERE(t2.date BETWEEN' 2014-08-01 00:00:00' AND' 2014-09-01   00:00:00&#39)

如果t2.date的类型是varchar或text,则查询看起来像这样,

  

在CAST之间(' 2014-08-01' AS DATE)和CAST(' 2014-09-01'   日期);

答案 3 :(得分:1)

一个简单的解决方案是使用LIKE运算符。

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 所以它会成为

LIKE'2014-08 - %'

希望它有所帮助!

快乐编码!!!

答案 4 :(得分:1)

如果" t2.date"这对我有用。字段是TIMESTAMP:

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