Oracle APEX中实现1-7循环日ID:计算可用日时自动重置计数
实现星期几的循环计数(超过7自动重置为1)
问题背景
我有两张表:
- 用数字标识星期各天的日程表:
CREATE TABLE days_schedule ( days_schedule_id INT, schedule_id INT, day_id INT); INSERT INTO TABLE days_schedule VALUES (1001, 1007, 1); INSERT INTO TABLE days_schedule (1002, 1008, 2); ...
- 包含发货信息的表,其中
AVAILABLE DAY列表示收货后产品可用的天数。比如初始日为周一(day_id=1),若AVAILABLE DAY=14,则14天后产品在周日(day_id=7)可用。
目前我使用的SQL语句如下:
SELECT ..., CONCAT(CONCAT(CONCAT( sd.day_id + sch.available_day, ' (' ), sch.available_day ), ')' ) as 'Available Day' FROM schedule sch INNER JOIN days_schedule sd ON (sch.schedule_id = sd.schedule_id)
问题是直接将两列值相加只会得到总和(比如上述示例中的15),我需要实现相加后数值超过7时自动重置为1的循环计数。
解决方案
要实现这种1-7的循环计数,核心是用模运算来调整结果,不过需要注意处理刚好整除的情况(比如总和是7的倍数时,要返回7而不是0)。
修改后的循环计数公式为:
((sd.day_id + sch.available_day - 1) % 7) + 1
公式逻辑拆解:
- 先
-1:把day_id的取值范围从1-7转换为0-6,让模运算的结果更易适配循环逻辑 - 再
%7:对总和取模7,得到0-6的结果(对应原星期数的0=周日,6=周六) - 最后
+1:把结果转换回1-7的星期数标识
把这个公式代入你的SQL语句中,最终代码如下:
SELECT ..., CONCAT( ((sd.day_id + sch.available_day - 1) % 7) + 1, ' (', sch.available_day, ')' ) as 'Available Day' FROM schedule sch INNER JOIN days_schedule sd ON (sch.schedule_id = sd.schedule_id)
验证几个典型场景:
- 当
day_id=1(周一),available_day=14时:((1+14-1)%7)+1 = (14%7)+1 = 0+1=7(周日),完全符合预期 - 当
day_id=7(周日),available_day=1时:((7+1-1)%7)+1 = (7%7)+1=0+1=1(周一),正确实现循环 - 当
day_id=3(周三),available_day=5时:((3+5-1)%7)+1=(7%7)+1=0+1=7(周日),计算逻辑正确
内容的提问来源于stack exchange,提问作者HSN
相关产品推荐
相关产品推荐

