PL / SQL выбрать из таблицы между 2 датами, используя переменные - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь выбрать из таблицы, используя в предложении where 2, переменные для фильтрации записей между диапазонами дат; две переменные имеют следующие значения:

START DATE: 31-MAR-2019 00:00:00 and END DATE: 17-FEB-2020 05:00:00

однако, если я использую переменные в предложении where как

value_dtime BETWEEN TO_DATE(Start_Date) AND TO_DATE(End_Date);

, я получу неправильный набор данных, тогда как если я изменю где предложение следующим образом

value_dtime BETWEEN TO_DATE('31-MAR-2019 00:00:00') AND TO_DATE('17-FEB-2020 05:00:00');

Я получил правильный набор данных; под запросом, который я использую.

DECLARE
Start_Date VARCHAR(20):='31-MAR-2019 00:00:00';
End_Date VARCHAR(20):= TO_CHAR(sysdate,'DD-MON-YYYY') || ' 05:00:00' ; 

BEGIN

DBMS_OUTPUT.PUT_LINE('START DATE: ' || Start_Date || ' and END DATE: ' || End_Date); 

delete from inputs;

INSERT INTO inputs(dataset_id,asset_id,asset_name,value_numeric,added_by,value_date) 
SELECT 
   1,                   --value from LOOK_DATASETS table
  v.meas_ass_id ,   
   a.meas_id ,
  v.numeric_value ,
   v.mod_user,
   v.value_dtime  

FROM
   halo.t_meas_value@LNKHALO v
    JOIN halo.t_meas_ass@LNKHALO a ON a.ass_id = v.meas_ass_id
   WHERE   
     value_dtime BETWEEN TO_DATE(Start_Date) AND TO_DATE(End_Date);
END:

Может кто-нибудь сказать, пожалуйста, как получить мой правильный набор данных, используя 2 переменные, а не жестко закодированные строки даты?

Я использую oracle 12 C databae и SQL developer 19 как IDE

1 Ответ

0 голосов
/ 17 февраля 2020

Если столбец VALUE_DTIME равен DATE datatpye, то вы должны работать с датами, а не со строками (т. Е. varchar2 значения). Я бы посоветовал вам сделать это следующим образом:

  • использовать литерал даты всегда в формате DATE 'YYYY-MM-DD'
  • усечение sysdate устанавливает дату до сегодняшней полуночи; добавление 5/24 добавляет 5 часов, так что это «сегодня в 05:00 утра» для локально объявленных переменных, таких как l_ или v_, поскольку чаще всего люди используют одно и то же имя для столбцов и переменных (или параметров), что вызывает путаницу и ошибки

Если VALUE_DTIME - строка, то вы столкнетесь с другими проблемами, если значения, хранящиеся в них, не являются одинаковыми и / или имеют правильный формат даты.

OK, здесь вы go:

DECLARE
   l_start_date  DATE := DATE '2019-03-31';
   l_end_date    DATE := TRUNC (SYSDATE) + 5 / 24;
BEGIN
   DBMS_OUTPUT.put_line (
      'START DATE: ' || start_date || ' and END DATE: ' || end_date);

   DELETE FROM inputs;

   INSERT INTO inputs (dataset_id,
                       asset_id,
                       asset_name,
                       value_numeric,
                       added_by,
                       value_date)
      SELECT 1,                               --value from LOOK_DATASETS table
             v.meas_ass_id,
             a.meas_id,
             v.numeric_value,
             v.mod_user,
             v.value_dtime
        FROM halo.t_meas_value@lnkhalo v
             JOIN halo.t_meas_ass@lnkhalo a ON a.ass_id = v.meas_ass_id
       WHERE value_dtime BETWEEN l_start_date AND l_end_date;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...