Oracle10g PL/SQL使用变量从两个日期之间的表中选择

Oracle10g PL/SQL使用变量从两个日期之间的表中选择,oracle10g,oracle-sqldeveloper,Oracle10g,Oracle Sqldeveloper,我试图从where子句2 vaiables中使用的表格中进行选择,以筛选日期范围之间的记录;这两个变量具有以下值: 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子句,如下所示 valu

我试图从where子句2 vaiables中使用的表格中进行选择,以筛选日期范围之间的记录;这两个变量具有以下值:

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 Database和SQL developer 19作为IDE

如果
VALUE\u DTIME
列是
DATE
datatpye,那么您应该使用日期,而不是字符串(即
varchar2
值)。我建议你按如下方式做:

  • “使用日期文字”始终采用
    日期'YYYY-MM-DD'
    格式
  • 截断sysdate将日期设置为今天的午夜;添加5/24将添加5小时,因此是“今天早上05:00”
  • where
    子句是
    where value\u dtime在l\u开始日期和l\u结束日期之间
    • 对于本地声明的变量,例如
      l_
      v_
      使用前缀通常是一个好主意,因为人们经常对列和变量(或参数)使用相同的名称,这会导致混淆和错误

如果
VALUE\u 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;

非常感谢您的代码建议和您的解决方案,当然,您的解决方案非常有效。如果我想在l_结束日期加上05:30:00(那么小时和分钟),正确的语法是什么?不客气。您需要添加
trunc(sysdate)+5/24+30/(24*60)
,因为一天有24小时(即5/24),而一小时有60分钟(即30/(24*60))。