比较 DB2 日期和 RPG 日期

Compare DB2 Date with RPG date

我对如何比较 DB2 日期、时间字段与 RPG 日期和时间字段有疑问

 If (Zpschdt < CurDat or (ZPschdt = Curdat and  
    (%Time() - ZPschtm) > 30));    

例如,在上面的代码中,Curdat 是一个字符字段,其中包含使用以下行填充的日期值

CurDat = %CHAR(%DATE():*MDY);

%Time() 即当前时间需要从 ZPschtm 中减去,ZPschtm 是一个 DB2 时间字段,如果差异大于 30 分钟则需要检查。如何实现?

不能将字符变量与日期变量进行比较。

通常,您必须将字符转换为日期,或者将日期转换为字符。

因为你的字符变量是*MDY格式,所以转换成日期会更容易;否则您需要将格式更改为 YYYYMMDD,以便将其作为数字或字符进行比较。

If Zpschdt < %Date(CurDat:*MDY)...

我认为我已经找到了一个足够好的解决方案,如下所示:

If ( %Diff(%Date():Zpschdt:*Days) > 1 or    
(%Diff(%Date():Zpschdt:*Days) = 0 and       
%Diff(%Time():ZPschtm:*Minutes) > 30));     

Or - %Diff(%Date():Zpschdt:*Days) > 1 的第一个条件检查当前日期是否比更改日期至少提前一天。

第二个条件:

(%Diff(%Date():Zpschdt:*Days) = 0 and       
    %Diff(%Time():ZPschtm:*Minutes) > 30))

检查更改日期是否与当天相同,以及当前时间是否比更改时间提前至少 30 分钟..

这样好看吗?似乎做的工作..

如果您想查找超过 30 分钟的日程安排日期和时间,并且时间范围需要跨天,您将不得不使用时间戳而不是日期和时间。为了处理你的情况,定义一个时间戳字段,分配计划日期和时间,将 30 分钟添加到时间戳,并将其与当前时间戳进行比较。像这样:

dcl-s ts     Timestamp;

ts = zschdt + zschtm + %minutes(30);
if ts < %timestamp();
  // do something here
endif;