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

如何查询数据表中距离当前选中日期最近的上一个可用日期?

实现方案

1. 拼接基准日期

先将GET参数传入的年月,拼接为你表中统一的每月1号的日期格式作为查询基准:

// 先校验传入的年月为合法数值
$currentYear = (int)$request->get('year');
$currentMonth = (int)$request->get('month');
// 拼接为 Y-m-01 格式的基准日期
$baseDate = date('Y-m-d', strtotime($currentYear.'-'.$currentMonth.'-01'));

如果你项目中用了Carbon日期库,也可以用Carbon生成:

$baseDate = Carbon::create($currentYear, $currentMonth, 1)->toDateString();

2. 查询最近上一个可用日期

筛选所有小于基准日期的记录,按日期倒序排序后取第一条,就是离当前选中日期最近的上一个有效日期:

$prevDate = DB::table('budgets')
    ->where('date', '<', $baseDate)
    ->orderBy('date', 'desc')
    ->value('date');

// 存在上一个有效日期的情况下生成跳转链接
if ($prevDate) {
    $prevYear = date('Y', strtotime($prevDate));
    $prevMonth = date('m', strtotime($prevDate));
    $prevLink = url('dashboard?month='.$prevMonth.'&year='.$prevYear);
}

3. 查询最近下一个可用日期

逻辑和上一个相反,筛选大于基准日期的记录,按日期正序排序后取第一条即可:

$nextDate = DB::table('budgets')
    ->where('date', '>', $baseDate)
    ->orderBy('date', 'asc')
    ->value('date');

// 存在下一个有效日期的情况下生成跳转链接
if ($nextDate) {
    $nextYear = date('Y', strtotime($nextDate));
    $nextMonth = date('m', strtotime($nextDate));
    $nextLink = url('dashboard?month='.$nextMonth.'&year='.$nextYear);
}

注意事项

  1. 如果你实际存储日期的字段是created_at,把上面代码中的date字段名替换为created_at即可。
  2. 你原来的代码存在明显错误:计算$prev_year时用了date('m'),会拿到月份值而非年份,导致生成的链接参数错误,上述方案已经规避了该问题。
  3. 该方案只需要单次查询即可拿到结果,性能远优于逐月判断的逻辑,只需要给date字段加索引,哪怕表数据量很大也能保持查询效率。
  4. 按照你的示例,当前选中2021-07-01时,小于该日期的最大记录就是2020-12-01,完全符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 09:24:03