我是 SQL 编程的新手。
我需要制定一个比较日期的程序。该过程中的唯一参数是用户在 Java 程序中输入的日期。我需要检查该参数(日期)是否在一年前。换句话说,我需要将它与 SYSDATE 减去一年进行比较。如果是这种情况,我必须“清除”所有与“时间表”相关的表(其中有 2 个)。
例如,假设用户输入 2013-04-13,我的程序必须将其与 SYSDATE - 1 年进行比较(在这种情况下,它将是 2014-12-03)。由于该值小于今天减去一年,因此必须清除表“MovieSchedule”和“ChannelSchedule”。如果输入的日期是 2014-12-16,因为它现在比 SYSDATE 减去一年多,所以该过程必须发回一个明确的错误,我将能够在 Java 程序中使用该错误。
现在,正如我所说,我对 PL/SQL 过程编程完全陌生,因此,通过在互联网上查找教程,我可以得出以下结论:
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;
我什至不知道这是否是编写我想要的程序的正确方法。正如你所看到的,我的问题是如何在程序中实现我的条件,而不是其背后的逻辑。我责怪我缺乏语言练习。
请告诉我是否需要更具体,或者您是否需要更多信息才能帮助我。感谢您的帮助,祝您有美好的一天:)
最佳答案
第 1 步,定义年份。应该是显而易见的,但事实并非如此。我发现月份和年份的定义在野外存在差异。我见过一年定义为 52 周(这从来都不是实际的一年)和 365 天(每 4 年中的 3 天),偶尔也有 360 天! (30天/月*12个月)
sysdate - 365
给出 365 天前的日期。
ADD_MONTHS(sysdate, -12)
将给出 12 个月前的日期。在这种情况下sysdate
是 2 月 29 日,结果将为上一年的 2 月 28 日。
sysdate - interval '1' year
很诱人,但是interval year to month
当“结果”是不存在的一天时,算术会抛出错误。
select date '2012-02-28' - interval '1' year from dual;
02/28/2011
select date '2012-02-29' - interval '1' year from dual;
ORA-01839: date not valid for month specified
关于oracle - 如何比较 PL/SQL 过程中的日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34074354/