首页 > 解决方案 > 在Mysql中选择日期返回错误的数据

问题描述

我正在尝试生成报告,但它返回的数据不正确。我正在尝试搜索两个不同日期之间的信息。

$data1 = '21/02/2019 03:46';
$data2 = '16/08/2019 03:46';

$data1 = DateTime::createFromFormat('d/m/Y H:i', $data1)->format('Y-m-d');
$data2 = DateTime::createFromFormat('d/m/Y H:i', $data2)->format('Y-m-d');

 echo $data1;

$sql = "
SELECT p.pedido_id 
     , p.pedido_status
     , STR_TO_DATE(p.pedido_data,'%d/%m/%Y') as pedido_data
     , l.lista_pedido
     , l.lista_item as item_id
     , l.lista_title as item_title
     , SUM(l.lista_qtde) as total 
  FROM pedido p
  JOIN lista l
    ON lista_pedido = pedido_id 
 WHERE pedido_status = 3 
   AND (pedido_data >= $data1 AND pedido_data <= $data2) 
 GROUP by item_id;
 ";


$query = mysqli_query($conn,$sql);

当它出现结果时,它也会带来其他日期的结果。

这是结果表:

253 Fio de Malha - Marfim   2018-12-08
254 Fio de Malha - Areia    2018-12-07
257 Kit Clutch alça corrente Pérola 2019-02-18
258 Alça corrente Acrílica - Branca 2019-02-18
259 Alça corrente Acrílica - Preta  2019-02-18
261 Alça corrente Acrílica - Goiaba 2019-02-19
262 Alça corrente Acrílica - Vermelha   2019-02-24
263 Alça corrente Acrílica - Marrom 2019-02-26

如果有人可以帮助我解决这个问题,我将不胜感激。我不知道我哪里错了。

标签: phpmysqldate

解决方案


您的问题在于您的WHERE条款的这一部分:

AND (pedido_data >= $data1 AND pedido_data <= $data2) 

由于您无法访问WHERE子句中的别名,因此 MySQL 在此测试中使用您的原始日期列值,因此比较是以文本而不是日期的形式进行的。您需要将此行更改为

AND STR_TO_DATE(p.pedido_data,'%d/%m/%Y') BETWEEN '$data1' AND '$data2'

$data1还要注意在and值周围添加引号$data2(否则2019-02-28会被逐字解释为 1989)。

请注意,如果您将别名命名为与列名称不同的名称,您将WHERE在尝试执行查询时收到有关该子句的 MySQL 错误消息,这将立即显示问题。


推荐阅读