如何查询数据表中距离当前选中日期最近的上一个可用日期?
实现方案
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); }
注意事项
- 如果你实际存储日期的字段是
created_at,把上面代码中的date字段名替换为created_at即可。 - 你原来的代码存在明显错误:计算
$prev_year时用了date('m'),会拿到月份值而非年份,导致生成的链接参数错误,上述方案已经规避了该问题。 - 该方案只需要单次查询即可拿到结果,性能远优于逐月判断的逻辑,只需要给
date字段加索引,哪怕表数据量很大也能保持查询效率。 - 按照你的示例,当前选中2021-07-01时,小于该日期的最大记录就是2020-12-01,完全符合需求。
内容的提问来源于stack exchange,提问作者JasonF
相关产品推荐
相关产品推荐

