Oracle使用绑定变量按状态规则计算项目延期天数的SQL写法
Oracle 符合业务规则的SQL实现
核心注意点
- Oracle中DATE类型值直接做减法即可得到两个日期相差的自然天数,无需额外调用日期差函数
- 用
CASE表达式匹配不同状态的延期天数计算逻辑,直接过滤NonExceed状态的记录 - 修正原伪代码的字段拼写错误(
PROJEC应为PROJECT)、重复计算列问题 - Oracle绑定变量使用
:作为前缀,建议显式做日期类型转换,避免隐式转换导致的格式错误 - 注意表结构中开始日期字段名为
STARTDYA,编写时需和实际表字段名完全一致,不要自行修改为通用拼写
正式SQL代码(生产环境绑定变量写法)
SELECT PROJECT, PJID, CASE STATUS WHEN 'SExceed' THEN :bind_target_date - STARTDYA WHEN 'EExceed' THEN :bind_target_date - ENDDAY END AS DaysDelayed FROM PROJECT WHERE STATUS IN ('SExceed', 'EExceed');
代码中:bind_target_date即为设置的绑定变量,传入DATE类型的10/31/2021即可。
本地测试用固定值写法
如果需要在SQL Developer、PL/SQL等工具中直接验证结果,可使用TO_DATE函数显式转换日期格式(匹配表中MM/DD/YYYY的日期存储格式):
SELECT PROJECT, PJID, CASE STATUS WHEN 'SExceed' THEN TO_DATE('10/31/2021', 'MM/DD/YYYY') - STARTDYA WHEN 'EExceed' THEN TO_DATE('10/31/2021', 'MM/DD/YYYY') - ENDDAY END AS DaysDelayed FROM PROJECT WHERE STATUS IN ('SExceed', 'EExceed');
执行上述测试SQL即可得到给出的期望结果。如果运行后Heat P07的延期天数不符合预期,请检查表中P07的
STARTDYA字段实际值是否和测试数据一致,修正后即可得到60天的正确结果。
内容的提问来源于stack exchange,提问作者coder
相关产品推荐
相关产品推荐

