Reputation: 10254
I need to add a couple and statements to my WHERE clause.
I need to get data from today back 2 years. I'm not sure how to write that in SQL. I got every thing else though, so it's at the end of the code:
FUNCTION summarize_item_search_data (p_obj_code IN VARCHAR2, p_val2 IN VARCHAR2,
p_sac IN NUMBER, p_job_type_id IN NUMBER,
p_sup IN NUMBER)
RETURN sys_refcursor
IS
stmt VARCHAR2(4000);
result_cur sys_refcursor;
BEGIN
OPEN result_cur FOR
SELECT DISTINCT jp.id, jp.row_top.mwslin AS mwslin, jp.obj_code, jp.jobload_year, jp.row_top.fiscal_year AS fiscal_year,
val1s.sac, val2s.val2, val1s.val1,
DECODE( jp.row_top.val1_id, NULL, jp.row_top.nomenclature ,val1s.nomenclature) AS nomenclature, jp.row_top.sup AS sup
FROM schedules sch, job_plans JP, master_val1 val1s, master_val2 val2s, TABLE(val2s.group_id) (+) ntab,
groups pgds
WHERE
-- stmt := stmt || ' AND ''' || p_year || ''' = ntab.fiscal_year(+)';
(val1s.sac = p_sac OR p_sac IS NULL) AND
(UPPER(val2s.val2) LIKE UPPER(p_val2) OR p_val2 IS NULL) AND
(UPPER(jp.obj_code) LIKE UPPER(p_obj_code) OR p_obj_code IS NULL) AND
(jp.row_top.sup <= p_sup OR p_sup IS NULL) AND
(jp.row_top.job_type_id = p_job_type_id OR p_job_type_id IS NULL)
AND ntab.group_id = pgds.id(+)
AND jp.row_top.val1_id = val1s.id(+)
AND val1s.val2_id = val2s.id(+)
AND jp.jobload_year >
AND fiscal_year >
RETURN result_cur;
END summarize_item_search_data;
Upvotes: 0
Views: 119
Reputation: 26177
AND jp.jobload_year > ADD_MONTHS(CURRENT_DATE, -24)
AND fiscal_year > ADD_MONTHS(CURRENT_DATE, -24)
I see those fields aren't datetime, so that won't work. You would need to convert them to datetime, or convert to integer and compare by year alone. Going with the first option, you could try:
AND TO_DATE('1-1-'||jp.jobload_year) > ADD_MONTHS(CURRENT_DATE, -24)
AND TO_DATE('1-1-'||fiscal_year) > ADD_MONTHS(CURRENT_DATE, -24)
Although it's not very dynamic. Could wait for a better solution.
Upvotes: 2
Reputation: 17429
@Shredder's solution is perfectly functional, but it isn't sargable. Even if there is no applicable index today, designing queries so that they can take advantage of indexes that may be created in the future is a good practice (assuming that it doesn't add significant complexity):
AND jp.jobload_year > TO_CHAR(ADD_MONTHS(CURRENT_DATE, -24),'YYYY')
AND fiscal_year > TO_CHAR(ADD_MONTHS(CURRENT_DATE, -24),'YYYY')
Upvotes: 1