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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 23:45:35