Quering датируется 2 годами - PullRequest
       0

Quering датируется 2 годами

0 голосов
/ 22 сентября 2011

Мне нужно добавить пару и утверждения в мое предложение WHERE.

Мне нужно получить данные за сегодня 2 года назад. Я не уверен, как написать это в SQL. Я получил все остальное, так что это в конце кода:

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;

Ответы [ 2 ]

2 голосов
/ 22 сентября 2011
AND  jp.jobload_year > ADD_MONTHS(CURRENT_DATE, -24)
AND  fiscal_year > ADD_MONTHS(CURRENT_DATE, -24)

Я вижу, что эти поля не datetime, так что это не будет работать.Вам нужно будет преобразовать их в дату и время или в целое число и сравнить только по годам.Переходя к первому варианту, вы можете попробовать:

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)

Хотя он не очень динамический .Могли бы дождаться лучшего решения.

1 голос
/ 22 сентября 2011

@ Решение Шреддера совершенно функционально, но оно не sargable .Даже если сегодня нет применимого индекса, рекомендуется разрабатывать запросы, чтобы они могли использовать преимущества индексов, которые могут быть созданы в будущем (при условии, что он не добавляет существенной сложности):

AND jp.jobload_year > TO_CHAR(ADD_MONTHS(CURRENT_DATE, -24),'YYYY')
AND fiscal_year > TO_CHAR(ADD_MONTHS(CURRENT_DATE, -24),'YYYY')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...