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

Laravel如何基于季度、年份两个关联列查询指定区间数据

问题原因

你原来的写法存在逻辑漏洞:同时对年份和季度做区间筛选时,会强制要求所有匹配数据的季度同时落在[$startQuartal, $endQuartal]区间内。比如查询2019Q3到2020Q2时,季度区间是32本身是无效范围,哪怕调整顺序为23,也会把2019年Q1/Q2、2020年Q3/Q4排除,无法得到正确结果。

解决方案

方案1:分条件逻辑判断(兼容性最好)

通过分组条件分别处理三种匹配场景:年份在起止年中间的全匹配、等于起始年的季度下限匹配、等于结束年的季度上限匹配,代码如下:

// 示例参数,可根据你的业务传入动态值
$startYear = 2019;
$startQuartal = 3;
$endYear = 2020;
$endQuartal = 2;

DB::table($table)
    ->where(function ($query) use ($startYear, $startQuartal, $endYear, $endQuartal) {
        // 年份严格在起止年份之间的所有季度都符合要求
        $query->where('year', '>', $startYear)
            ->where('year', '<', $endYear);
    })
    ->orWhere(function ($query) use ($startYear, $startQuartal) {
        // 等于起始年份的,季度需要大于等于起始季度
        $query->where('year', $startYear)
            ->where('quartal', '>=', $startQuartal);
    })
    ->orWhere(function ($query) use ($endYear, $endQuartal) {
        // 等于结束年份的,季度需要小于等于结束季度
        $query->where('year', $endYear)
            ->where('quartal', '<=', $endQuartal);
    })
    ->get();

方案2:拼接字段做区间匹配(写法更简洁)

把年份和季度拼接为一个连续的数值/字符串直接做区间匹配,写法更精简:

$startCondition = $startYear . $startQuartal;
$endCondition = $endYear . $endQuartal;

DB::table($table)
    ->whereBetween(DB::raw("CONCAT(year, quartal)"), [$startCondition, $endCondition])
    ->get();

注意:如果你的季度是1位数存储,这个方案可以直接使用,无需额外处理。

内容的提问来源于stack exchange,提问作者Fuad Fadhil Azzar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:39:02