Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 如何比较PL/SQL过程中的日期?_Oracle_Date_Stored Procedures_Plsql - Fatal编程技术网

Oracle 如何比较PL/SQL过程中的日期?

Oracle 如何比较PL/SQL过程中的日期?,oracle,date,stored-procedures,plsql,Oracle,Date,Stored Procedures,Plsql,我是SQL编程的新手 我需要做一个程序来比较日期。过程中唯一的参数是用户在Java程序中键入的日期。我需要检查那个论点(日期)是否在一年前。换句话说,我需要将它与SYSDATE减去一年进行比较。如果是这样,我必须“清除”所有与“计划”相关的表(其中有两个) 例如,假设用户类型为2013-04-13,我的过程必须将其与SYSDATE-1年进行比较(在这种情况下,它将是2014-12-03)。由于该值小于今天减去一年,因此必须清除表“MovieSchedule”和“ChannelSchedule”。

我是SQL编程的新手

我需要做一个程序来比较日期。过程中唯一的参数是用户在Java程序中键入的日期。我需要检查那个论点(日期)是否在一年前。换句话说,我需要将它与SYSDATE减去一年进行比较。如果是这样,我必须“清除”所有与“计划”相关的表(其中有两个)

例如,假设用户类型为2013-04-13,我的过程必须将其与SYSDATE-1年进行比较(在这种情况下,它将是2014-12-03)。由于该值小于今天减去一年,因此必须清除表“MovieSchedule”和“ChannelSchedule”。如果输入的日期是2014-12-16,因为现在已经超过SYSDATE减去一年,那么该过程必须返回一个显式错误,我将能够在Java程序中使用该错误

现在,正如我所说,我对PL/SQL中的过程编程是完全陌生的,所以我可以通过在internet上查找教程得出以下结论:

CREATE OR REPLACE
PROCEDURE purge_schedule(purgeDate date) AS

DECLARE
currentDate := to_date(SYSDATE, 'YYYMMDD');

BEGIN

    -- IF purgeDate < (currentDate - 1year)
        -- delete content in "MovieSchedule" and "ChannelSchedule"
    -- ELSE
        -- return explicit error

END purge_schedule;
创建或替换
程序清除计划(清除日期)如下
声明
currentDate:=截止日期(SYSDATE,'yymmdd');
开始
--如果purgeDate<(当前日期-1年)
--删除“MovieSchedule”和“ChannelSchedule”中的内容
--否则
--返回显式错误
结束清除计划;
我甚至不知道这是否是编写我想要的过程的正确方法。正如你所看到的,我的问题是如何在过程中实现我的条件,而不是它背后的逻辑。我责备我缺乏语言练习


请告诉我,如果我必须更具体,如果你需要更多的信息,以帮助我。感谢您的帮助,祝您度过愉快的一天:)

它应该能满足您的需求:

IF purgeDate < SYSDATE -365 THEN
    ...
END IF;
如果purgeDate
步骤1,定义年份。应该是显而易见的,但事实并非如此。我发现在野外,月和年的定义各不相同。我见过一年被定义为52周,这从来不是一个实际的一年,365天,这与一年相匹配,比每4年中的3年少一点,偶尔360天!(30天/月*12个月)

sysdate-365
给出365天前的日期

ADD_MONTHS(sysdate,-12)
将给出12个月前的日期。如果
sysdate
是2月29日,则结果将是上一年的2月28日

sysdate-间隔“1”年
很诱人,但是当“结果”是不存在的一天时,
interval year to month
算法会抛出错误

select date '2012-02-28' - interval '1' year from dual;
2011年2月28日

ORA-01839:指定月份的日期无效

我在下面演示了一个可以帮助您的工作代码。让我知道这是否有帮助。
--编译存储过程
创建或替换程序清除计划(
purgeDate(日期中的日期)
作为
currentDate:=系统日期;
开始
如果purgeDate<添加月份(SYSDATE,-12),则
从环境管理计划中删除;
从EMP_V1中删除;
dbms_output.put_行('已成功清除记录');
其他的
RAISE_应用程序_错误(-20001,“提供的日期不在范围内,未调用删除”,TRUE);
如果结束;
结束清除计划;
--违反程序
打开服务器输出;
执行清理计划(截止日期('2013年12月12日','MM/DD/YYYY');
--输出
已成功清除记录
--针对负面场景执行
打开服务器输出;
执行清理计划(截止日期('2017年12月12日','MM/DD/YYYY');
--显式异常引发
执行清理计划(截止日期('2017年12月12日','MM/DD/YYYY');
错误报告-
ORA-20001:提供的日期不在范围内,未调用删除
ORA-06512:在“AVROY.净化计划”第11行
ORA-06512:在第1行

到日期(SYSDATE,'YYYMMDD')
毫无意义。它将
sysdate
(这是一个
DATE
)转换成
varchar
,然后将
varchar
转换回它最初的
DATE
。在
DATE
值上调用
to_DATE()
DATE
转换成
DATE
是无用和错误的。它将
date
值转换为
varchar
,然后将
varchar
转换回它最初的
date
。哦,这样我们就可以只传递简单的日期字符串,而不是用to_date()解析它了?
purgeDate
已经定义为
date
。没有必要将其“解析”为日期。这是错误的编辑<代码>截止日期(purgeDate,'MM/DD/YYYY')无效且错误。调用过程时传递适当的
日期
文本是绝对正确的
select date '2012-02-29' - interval '1' year from dual;
I have illustrated a below working code which help you. Let me know if this helps.

--Compiling the stored proc
CREATE OR REPLACE PROCEDURE purge_schedule(
    purgeDate IN DATE )
AS
  currentDate DATE:=SYSDATE;
BEGIN
  IF purgeDate < ADD_MONTHS(SYSDATE,-12) THEN
    DELETE FROM EMP;
    DELETE FROM EMP_V1;
    dbms_output.put_line('Records purged successfully');
  ELSE
    RAISE_APPLICATION_ERROR(-20001,'Date provided is not in range deletion not invoked',TRUE);
  END IF;
END purge_schedule;

-- Exceuting the proc
set serveroutput on;
exec purge_schedule(to_date('12/12/2013','MM/DD/YYYY'));

--  Output
Records purged successfully

--Executing for negative scenario
set serveroutput on;
exec purge_schedule(TO_DATE('12/12/2017','MM/DD/YYYY'));

--Explicit exception raise

exec purge_schedule(TO_DATE('12/12/2017','MM/DD/YYYY'));
Error report -
ORA-20001: Date provided is not in range deletion not invoked
ORA-06512: at "AVROY.PURGE_SCHEDULE", line 11
ORA-06512: at line 1