首页 > 解决方案 > php使用格式化的日期列选择2个日期之间的记录

问题描述

我需要选择两个日期之间的订单记录。数据库上的日期格式如下:2020 年 1 月 1 日 -> 使用%F %j, %Y格式。

我尝试获取记录是:

$from_date = 'January 1, 2020';
$to_date = 'January 5, 2020';

$sql = "
SELECT * 
  FROM orders 
 WHERE order_date STR_TO_DATE(order_date, '%F %j, %Y') between STR_TO_DATE('$from_date', '%F %j, %Y') and STR_TO_DATE('$to_date', '%F %j, %Y') 
 GROUP 
    BY order_id
";

结果是null

我也尝试使用convert(order_date,'%F %j, %Y')但不起作用并向我显示相同的结果null

希望我清楚地解释这个问题。

谢谢

标签: phpmysqlsqlstringdate

解决方案


MySQL中没有'%F'说明符。你可能想要%M'

另外,'%j'应该是'%e':后者为您提供一个月中的一天数(从1to 31),而前者是一年中的一天数(从1to 365- 或366闰年)。

您的where子句应如下所示:

where str_to_date(order_date, '%M %e, %Y') 
    between str_to_date(:from_date, '%M %e, %Y') and str_to_date(:to_date, '%M %e, %Y') 

笔记:

  • 使用准备好的语句!不要在查询字符串中连接变量:这既低效(数据库需要在每次使用不同参数执行时解析语句)和不安全(您的代码对 SQL 注入开放)

  • 你真的应该考虑使用正确的数据类型来存储你的数据;将日期存储为字符串效率低下(您需要在需要过滤它们时转换字符串)并且不安全(您不能保证数据存储在表中时的数据完整性)

  • select *相处group by不好


推荐阅读