oracle10g - 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
解决方案
如果VALUE_DTIME
column 是DATE
datatpye,那么您应该使用日期,而不是字符串(即varchar2
值)。我建议你这样做:
- 使用日期文字始终采用
DATE 'YYYY-MM-DD'
格式 - 截断 sysdate 将日期设置为今天的午夜;添加 5/24 增加 5 小时,所以它是“今天早上 05:00”
where
子句是 thenWHERE value_dtime BETWEEN l_start_date AND l_end_date
- 对本地声明的变量使用前缀通常是个好主意,例如
l_
或v_
因为人们经常会为列和变量(或参数)使用相同的名称,这会导致混淆和错误
- 对本地声明的变量使用前缀通常是个好主意,例如
如果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;
推荐阅读
- python - Python“无法从'urllib3.util.ssl_'导入'ssl'”错误
- php - 在 Laravel 5.8 中阻止发送验证电子邮件地址电子邮件
- javascript - 如何使用 express 并且仅使用 JEST 来测试 rest api?
- java - Android 资源链接失败
- barcode-scanner - 在 Chrome 中将错误的条形码扫描到 Web 表单中?
- unit-testing - How can I know if something is a Integration Test or Unit Test
- javascript - 当使用从父级传递的参数在函数内部调用时,为什么 setTimeout 函数记录未定义?
- ssl - 如何使用 x.509 CA 证书在 tomcat 8.5 中启用 SSL
- c# - 如何添加包含 Grid、StackPanel 和 TextBlock 的 ListViewItem
- javascript - 为什么我的代码返回“无法读取未定义的属性''”?