我想弄清楚如何创建一个SQL查询来检查(:FROM_DATE
)和(:TO_DATE
)参数,如果NULL
将过去的月份日期放入这两个值,如果不是NULL
则接受在参数中输入的任何值。
例如:
如果用户输入(01-JAN-17
)FROM_DATE
,(31-JAN-17
)为TO_DATE
,我希望查询不会自动传递任何值TO_DATE
和FROM_DATE
。
如果用户未输入TO_DATE
和FROM_DATE
的任何值,或者传入了NULL
个值,我希望查询自动输入过去几个月的值(即,如果查询在2017年7月1日运行,则FROM_DATE
将为01-JUN-17
,TO_DATE
将为30-JUN-17
)。
我被暗示使用coalesce语句来处理多个值NULLS
(即AND ( (coalesce(null, :P_ORG) is null) or (ORG.ORGANIZATION_ID in :P_ORG)))
???
非常感谢任何帮助。
答案 0 :(得分:0)
类似的东西:
SELECT *
FROM your_table
WHERE your_date_column BETWEEN TO_DATE( :from_date, 'DD-MON-YYYY' )
AND TO_DATE( :to_date, 'DD-MON-YYYY' )
OR ( ( :from_date IS NULL OR :to_date IS NULL )
AND your_date_column BETWEEN ADD_MONTHS( TRUNC( SYSDATE, 'MM' ), -1 )
AND TRUNC( SYSDATE, 'MM' ) - 1
);
如果:from_date
或:to_date
中的任何一个(或两者)都是NULL
,则日期将与上个月进行比较。
如果您的表格中的日期时间组件并不总是设置为午夜,那么您需要使用:
SELECT *
FROM your_table
WHERE your_date_column BETWEEN TO_DATE( :from_date, 'DD-MON-YYYY' )
AND TO_DATE( :to_date, 'DD-MON-YYYY' )
OR ( ( :from_date IS NULL OR :to_date IS NULL )
AND your_date_column >= ADD_MONTHS( TRUNC( SYSDATE, 'MM' ), -1 )
AND your_date_column < TRUNC( SYSDATE, 'MM' )
);
答案 1 :(得分:0)
概念验证:请考虑以下查询,其中包含日期和值,并且我们希望对:from_date
和:to_date
之间的日期值进行求和。如果其中任何一个为null
,则查询将使用前一个月的第一天from_date
和前一个月的最后一天to_date
。请注意,如果一个日期被赋予实际值而另一个日期被保留null
,这将导致问题 - 您没有解释您希望如何处理。但这是一个不同的问题。
我使用SQL开发人员,在其中我不知道如何传递日期;我在字符串中显示传递,并将它们转换为日期。
with
test_data ( dt, val ) as (
select date '2017-05-29', 200 from dual union all
select date '2017-06-13', 150 from dual union all
select date '2017-06-18', 500 from dual
)
select sum(val) as sum_val
from test_data
where dt between coalesce(to_date(:from_date, 'yyyy-mm-dd'),
add_months(trunc(sysdate, 'mm'), -1))
and coalesce(to_date(:to_date , 'yyyy-mm-dd'), trunc(sysdate, 'mm') - 1)
;
答案 2 :(得分:0)
是的,您可以使用COALESCE
(或Oracle NVL
)。当参数为null时,将其替换为默认日期。
select *
from mytable
where mydate >= coalesce(:from_date, trunc(sysdate - interval '1' month), 'month')
and mydate <= coalesce(:to_date, last_day(sysdate - interval '1' month));