Laravel获取含今日在内未来3天员工生日的查询问题
问题分析
你当前的代码查询结果不符合预期,核心原因在于字符串格式的日期比较存在潜在风险,同时可能存在日期计算的细节疏漏:
- 你描述查询返回了11-08的员工,但按代码中
$from = now()->format('m-d')的逻辑,$from应为11-09,说明实际代码可能存在笔误(比如误写为now()->subDay()->format('m-d')); - 即便日期逻辑正确,直接用
DATE_FORMAT(dob, '%m-%d')做BETWEEN比较,若数据库中dob字段存在格式异常(如非标准日期类型),可能导致匹配失效。
解决方案
推荐使用基于日期天数差的查询方式,既能准确匹配今日及未来3天的生日,也能自动处理跨年场景:
public function upcomingBirthdays() { $today = now()->startOfDay(); $daysAhead = 3; $employees = Employees::where('team_id', 13) ->where('status', 1) ->where(function ($query) use ($today, $daysAhead) { // 匹配今年内的生日(非跨年场景) $query->whereRaw("DATEDIFF( STR_TO_DATE(CONCAT(YEAR(?), '-', DATE_FORMAT(dob, '%m-%d')), '%Y-%m-%d'), ? ) BETWEEN 0 AND ?", [$today, $today, $daysAhead]) // 匹配跨年的生日(比如今日是12-30,未来3天到明年1-2) ->orWhereRaw("DATEDIFF( STR_TO_DATE(CONCAT(YEAR(?) + 1, '-', DATE_FORMAT(dob, '%m-%d')), '%Y-%m-%d'), ? ) BETWEEN 0 AND ?", [$today, $today, $daysAhead]); }) ->orderBy('dob', 'DESC') ->get(); return view('frontend.employee.birthdays', compact('employees')); }
如果确定不会遇到跨年场景(比如当前是11月),也可以简化为更直接的版本:
public function upcomingBirthdays() { $from = now()->format('m-d'); $to = now()->addDays(3)->format('m-d'); $employees = Employees::whereRaw("DATE_FORMAT(dob, '%m-%d') >= ? AND DATE_FORMAT(dob, '%m-%d') <= ?", [$from, $to]) ->where('team_id', 13) ->where('status', 1) ->orderBy('dob', 'DESC') ->get(); return view('frontend.employee.birthdays', compact('employees')); }
排查提示:如果查询仍返回11-08的员工,请检查
$from的生成逻辑,确认没有误写subDay()等方法。
内容的提问来源于stack exchange,提问作者Wakil Ahmed
相关产品推荐
相关产品推荐

