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
相关产品推荐
相关产品推荐

