php - 在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
如果有人可以帮助我解决这个问题,我将不胜感激。我不知道我哪里错了。
解决方案
您的问题在于您的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 错误消息,这将立即显示问题。
推荐阅读
- javascript - 我的幻灯片库有问题
- javascript - 从选择元素中选择选项时触发更改事件
- java - 如何在基于 Docker 映像的 java:8-jdk-alpine 中使 curl 可用并保持映像干净?
- python - 如何从串口读取响应
- css - 在 Polymer 中使用 HTML-Tag 中的属性
- android - 片段的 startActivityForResult() 替代方案(通过片段完成任务并将结果传递给片段)
- c - 来自 C 的 Cython 将无符号字符数组传递给 Python
- arrays - VHDL - 同时添加大型 2D 阵列。这个的语法是什么
- macros - 如何在SAS中屏蔽此字符串中的所有字符
- javascript - Cordova Config 中的 errorUrl 无法在 Android 上运行