Arhn - архитектура программирования

PL/SQL выбирает из таблицы между двумя датами, используя переменные

Я пытаюсь выбрать из таблицы, используя переменные в разделе 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);

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

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 12C и SQL Developer 19 в качестве IDE.


Ответы:


1

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

  • использовать литерал даты всегда в формате DATE 'YYYY-MM-DD'
  • усечение sysdate устанавливает дату на сегодняшнюю полночь; добавление 5/24 добавляет 5 часов, так что это «сегодня в 05:00 утра»
  • where clause is then WHERE value_dtime BETWEEN l_start_date AND l_end_date
    • it is usually a good idea to use prefix for locally declared variables, such as l_ or v_ because it more than often happens that people use the same name for columns and variables (or parameters) which causes confusion and errors

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

Хорошо, вот:

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;
17.02.2020
  • Большое спасибо за ваше предложение кода и за ваше решение, которое, конечно, работает отлично. Если бы я хотел добавить 05:30:00 к l_end_date (то есть часы и минуты), каким был бы правильный синтаксис? 17.02.2020
  • Пожалуйста. Вы бы добавили trunc(sysdate) + 5/24 + 30/(24 * 60), потому что в сутках 24 часа (это для 5/24), а в часе 60 минут (это для 30/(24 * 60)). 17.02.2020
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..