PHP环境下使用BETWEEN编写DQL查询处理字符串格式日期相关问题
DQL日期字符串BETWEEN查询实现方案
方案1:PHP层预转换(更推荐)
这个方案不需要修改DQL本身,也不需要适配不同数据库的函数差异,兼容性最好。
- 先在PHP代码中将输入的日期字符串转换为
\DateTime对象,再绑定到DQL参数,Doctrine会自动完成类型匹配:
// 输入的日期字符串示例 $startStr = '2024-01-01'; $endStr = '2024-06-01'; // 转换为DateTime对象,格式符和输入字符串格式保持一致 $startDate = \DateTime::createFromFormat('Y-m-d', $startStr); $endDate = \DateTime::createFromFormat('Y-m-d', $endStr); // 编写DQL直接绑定参数即可 $dql = <<<DQL SELECT e FROM App\Entity\YourEntity e WHERE e.targetDateField BETWEEN :startDate AND :endDate DQL; $query = $entityManager->createQuery($dql) ->setParameter('startDate', $startDate) ->setParameter('endDate', $endDate);
如果输入字符串带时间,只需修改createFromFormat的格式符即可,比如Y-m-d H:i:s
方案2:DQL调用数据库原生转换函数
如果你需要直接在DQL层完成转换,可以调用对应数据库的字符串转日期函数:
MySQL环境
使用STR_TO_DATE函数,第二个参数为输入字符串的格式符:
SELECT e FROM App\Entity\YourEntity e WHERE e.targetDateField BETWEEN STR_TO_DATE(:startStr, '%Y-%m-%d') AND STR_TO_DATE(:endStr, '%Y-%m-%d')
PostgreSQL环境
使用TO_DATE函数,格式符规则和MySQL略有差异:
SELECT e FROM App\Entity\YourEntity e WHERE e.targetDateField BETWEEN TO_DATE(:startStr, 'YYYY-MM-DD') AND TO_DATE(:endStr, 'YYYY-MM-DD')
注意事项
- 转换日期时建议添加校验逻辑,避免格式不匹配导致转换失败返回空值
- 如果实体对应字段已经声明为datetime类型,优先选择方案1,无需额外处理函数注册、数据库适配问题
内容的提问来源于stack exchange,提问作者fatandaz
相关产品推荐
相关产品推荐

