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

Oracle APEX中实现1-7循环日ID:计算可用日时自动重置计数

实现星期几的循环计数(超过7自动重置为1)

问题背景

我有两张表:

  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);
...
  1. 包含发货信息的表,其中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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:57:48