本文详解在 laravel 中如何准确识别 `work_hour_end` 跨越到次日的工作时段(如 21:00 → 03:00),避免因仅依赖 `wheredate()` 导致数据误筛,并提供可直接落地的数据库查询逻辑与注意事项。
在处理排班、考勤或营业时段等业务场景时,常遇到「工作时段跨越午夜」的问题——例如 work_hour_start = '21:00:00',work_hour_end = '03:00:00'。此时,work_hour_end 在语义上属于次日,但数据库中仅存储时间(TIME 类型),无日期信息,导致无法直接用 whereDate('work_hour_end', Carbon::today()) 判断。
关键逻辑在于:若 work_hour_end (假设所有时段均合法且持续时间 ≤ 24 小时)。这是时间逻辑的可靠判据——同一天内结束时间必严格大于开始时间;反之,则说明已进入次日。
因此,正确查询今日创建、且工作时段跨至次日的记录,应使用 Laravel 的 whereColumn() 进行同行字段比较:
$attendanceIn = Attendance::where('employee_id', $id)
->whereColumn('work_hour_end', '<=', 'work_hour_start') // 跨日核心判断
->whereDate('created', Carbon::today())
->first();✅ 注意:whereColumn('a', '
⚠️ 补充注意事项:

$start = Carbon::parse($attendanceIn->work_hour_start);
$end = Carbon::parse($attendanceIn->work_hour_end);
$actualEnd = $end->lessThanOrEqualTo($start)
? $start->copy()->addDay()->setTimeFromTimeString($end)
: $end;总结:跨日时间判断的本质是逻辑推理而非日期拼接。善用 whereColumn() 进行字段间比较,既简洁又健壮,是 Laravel 处理此类问题的标准实践。