You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel使用SQL比对数据库日期时筛选失效,该如何正确处理?

Laravel数据库日期比对失效修复方案

问题根源

  • 代码中使用strtotime($today)将当前日期转换为Unix时间戳整数,但数据库pembibitan字段存储的是Y-m-d日期格式或Y-m-d H:i:s datetime格式的字符串,两种数据类型不匹配导致where比对逻辑失效,最终返回所有符合基础条件的数据。

修复方案

根据你数据库pembibitan字段的实际存储类型选择对应方案:

方案1:字段为date/datetime类型(Laravel官方推荐规范)

直接使用格式化后的日期字符串比对即可,无需转换为时间戳:

$today = now()->toDateString(); // 等效于 date('Y-m-d')
$dateUp = Jadwal::where('pembibitan', '>', $today)->get();
$date = Jadwal::where('pembibitan', '<', $today)->get();

return view('dashboard', compact('date', 'dateUp', 'today'));

方案2:字段确实存储Unix时间戳整数

需要确保比对两边都是时间戳格式,避免类型不匹配:

// 取今日零点的时间戳作为比对基准
$todayStartTimestamp = strtotime(date('Y-m-d 00:00:00'));
$dateUp = Jadwal::where('pembibitan', '>', $todayStartTimestamp)->get();
$date = Jadwal::where('pembibitan', '<', $todayStartTimestamp)->get();

优化建议

  • Laravel内置了whereDate、whereMonth、whereYear等专用日期查询方法,会自动适配数据库日期格式,兼容性更强,无需手动处理格式转换:
// 自动忽略datetime类型的时分秒,仅比对日期部分
$dateUp = Jadwal::whereDate('pembibitan', '>', now())->get();
$date = Jadwal::whereDate('pembibitan', '<', now())->get();
  • 如果pembibitan为模型固定日期字段,可在Jadwal模型的$dates属性中注册该字段,Laravel会自动将其转为Carbon对象,后续日期操作更便捷:
// 在 app/Models/Jadwal.php 中添加配置
protected $dates = [
    'pembibitan',
    // 其他需要自动转换的日期字段
];

内容的提问来源于stack exchange,提问作者Banta Solagratia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 02:54:04