如何改写SQL查询实现日期参数仅需传递一次?
改写SQL实现仅传递一次日期参数
首先修正原SQL的语法错误:SELECT语句开头多了一个多余的and,需要删除。
要实现仅传递一次日期参数,可以通过WITH子句封装日期参数的方式,将起始和结束日期定义在临时数据集中,后续查询直接引用该数据集的字段即可,无需重复输入参数。改写后的SQL如下:
WITH date_params AS ( SELECT '&from_date' AS start_date, '&to_date' AS end_date FROM dual ) SELECT a.recorded_hours, ((a.employee_hours + b.Quantity) / ((dp.end_date - dp.start_date)*24)) AS calculated_value FROM table1 a JOIN table2 b ON a.code = b.code AND a.site = b.site CROSS JOIN date_params dp WHERE a.reg_date BETWEEN dp.start_date AND dp.end_date
改写说明:
- 用
WITH date_params定义临时数据集,仅在这里输入一次&from_date和&to_date参数,后续通过dp.start_date、dp.end_date引用,避免重复传递 - 将原SQL的隐式逗号连接改为显式
JOIN,代码结构更清晰,符合现代SQL规范 - 为计算字段添加了别名
calculated_value,方便后续引用和理解
如果使用SQL*Plus环境,也可以通过预定义变量的方式实现,只需在查询前定义一次参数:
DEFINE from_date = '2024-01-01' DEFINE to_date = '2024-01-31' SELECT a.recorded_hours, ((a.employee_hours + b.Quantity) / ((&to_date - &from_date)*24)) AS calculated_value FROM table1 a JOIN table2 b ON a.code = b.code AND a.site = b.site WHERE a.reg_date BETWEEN &from_date AND &to_date
内容的提问来源于stack exchange,提问作者Maqay
相关产品推荐
相关产品推荐

