Laravel Eloquent 查询start_date与end_date区间内数据无效问题求解
错误原因
- 核心问题是你直接对
d.m.Y格式的字符串执行大小比较,字符串的字典排序规则和日期的时间先后逻辑完全不匹配。比如字符串层面01.12.2024会小于10.01.2024,但实际日期12月1日远晚于1月10日,比较结果完全错误。 - 额外如果你的数据库中
start_date、end_date字段本身是date/datetime类型,你传入d.m.Y格式的字符串数据库无法正确解析为日期,也会导致比较逻辑失效。
解决方案
情况1:数据库字段为日期类型(date/datetime)
直接传入标准Y-m-d格式的日期做比较即可,Laravel中可以直接用now()辅助函数生成当前日期:
$infos = Info::select('*') ->where('start_date', '<=', now()->toDateString()) ->where('end_date', '>=', now()->toDateString()) ->get();
情况2:数据库字段存储的就是d.m.Y格式的字符串
需要先把字符串字段转为日期类型再做比较,以MySQL为例可以用STR_TO_DATE函数处理:
$currentDate = date('Y-m-d'); $infos = Info::select('*') ->whereRaw('STR_TO_DATE(start_date, "%d.%m.%Y") <= ?', [$currentDate]) ->whereRaw('STR_TO_DATE(end_date, "%d.%m.%Y") >= ?', [$currentDate]) ->get();
内容的提问来源于stack exchange,提问作者DevNinja71
相关产品推荐
相关产品推荐

