Oracle 9.2分别比较日期和时间的过程

时间:2013-11-23 04:59:05

标签: oracle datetime plsql date-arithmetic

我有以下逻辑来分别比较日期和时间。

If current_date = DOG_Date and current time is less than 11.59pm
     Set ARD date to current date + 1 
     Set ARD time to 08:00am
End if;

If current date greater than DOG Date and current time is less than 07.00am
     Set ARD date to  next Day (Can be same day)
     Set ARD time to 08:00am
End if;

ARD格式应为dd.mm.yyyy ARD时间应为24hh.mi

你能帮我解决这个PLSQL的实现吗?我尝试并能够成功验证日期部分,但发现时间部分存在问题。

提前致谢, 此致

2 个答案:

答案 0 :(得分:1)

在此处分割时间和日期似乎没有任何好处。它似乎迫使你把它们存放在角色列中,这是一个经典的错误 - 通常以灾难结束。 Oracle的“日期”数据类型是日期时间;值得使用它。

假设您的所有日期和时间都是实际日期,您可以大大简化您的逻辑。首先,如果你的任何条件成立,“ARD时间”是早上8点。我怀疑你在11点59分的情况也是一个错误。如果你的意思是不到午夜,那么这种情况总是正确的,可以免除。这反过来使你的逻辑成为你的第一个条件。

If the current date is equal to the DOG date then
   ARD date is 8am tomorrow

这可以在PL / SQL中表示为:

if trunc(sysdate) = trunc(dog_date) then
   ard_date := trunc(sysdate) + interval '32' hour;
end if;

TRUNC(date)默认删除日期的时间部分。我知道你会说你想分开日期和时间,你可以用TO_CHAR()以你想要的任何方式将这个日期转换回字符。 Oracle包含datetime format models时间:

ard_date_char := to_char(ard_date, 'dd.mm.yyyy');
ard_time_char := to_char(ard_date, 'hh24:mi');

在你的第二个陈述中提到“相同”的一天对陌生人来说并不像你想象的那么直观。我认为这意味着你的“日”从早上7点开始。

逐点理解你的逻辑:

If current date greater than DOG Date 

可以表示为:

if trunc(sysdate) > trunc(dog_date)

和你的第二个条件:

and current time is less than 07.00am

将当前日期的时间与任意时间进行比较。为了进行此比较,您可以使用TRUNC()从当前日期删除时间部分,然后再添加7小时。通过将其与当前系统日期进行比较,您可以得到答案。

and sysdate < trunc(sysdate) + interval '7' hour

现在困难的一点

 Set ARD date to next Day (Can be same day)

假设(再次)你的“日”在早上7点开始,这里所需的增量可以是1分钟到24小时之间的任何值。但是,您已经知道您当前的时间是早上7点之前,这意味着您在“下一天”永远不会。然后,您可以始终假设它是当天。这就形成了完整的逻辑:

if trunc(sysdate) > trunc(dog_date) 
    and sysdate < trunc(sysdate) + interval '7' hour
       ard_date := trunc(sysdate) + interval '8' hour;
end if;

如果您的第一个IF语句确实需要11.59pm,您可以使用与第二个语句中相同的逻辑进行比较,即trunc(sysdate) + 1 - interval '1' minute

虽然您没有提供任何代码,但我怀疑您获取这些日期的方式并不排除在创建日期变量本身时几乎所有逻辑中的位置。考虑一下你是否真的需要做这些事情,例如,在选择日期时是否有CASE陈述(如果那确实是你正在做的事情)就足够了。

现在,这一切都假设您实际上使用了日期来存储日期。它听起来不像你有,所以你可能必须首先将所有内容转换为日期,然后从之后的日期转换回来。您可以使用TO_DATE()TO_CHAR()执行此操作。

但我强烈建议您将所有内容转换为日期。

答案 1 :(得分:0)

DECLARE
     dog_date DATE := to_date( '20/11/2013','dd/mm/yyyy');
     ard_date DATE;
BEGIN
     IF TRUNC(CURRENT_DATE) = TRUNC(dog_date) AND CURRENT_DATE < TRUNC(CURRENT_DATE) + 1 THEN
          ard_date := TRUNC(CURRENT_DATE) + 8/24 +1;
     END IF;

     IF TRUNC(CURRENT_DATE) > TRUNC(dog_date) AND CURRENT_DATE < TRUNC(CURRENT_DATE) + 7/24 THEN
          ard_date := TRUNC(CURRENT_DATE) + 8/24 +1; --as your need
     END IF;
END;