在 IBM iSeries SQL、select 上所有日期介于今天和 30 之间的记录

on IBM iSeries SQL, select all records with date between today and 30

在 IBM iSeries SQL 上,select 日期在今天和 30 天前之间的所有记录。请注意,iSeries 上的此日期存储为数字 8,而不是日期、时间戳或 Julian 日期。这是许多旧系统的典型特征。

SELECT DATFLD,
       digits(dec(year(now()-30 DAYS),4)) concat
       digits(dec(month(now()-30 DAYS),2)) concat 
       digits(dec(day(now()-30 DAYS),2)) 
FROM MyFILE
WHERE DATFLD>= 
       digits(dec(year(now()-30 DAYS),4)) concat 
       digits(dec(month(now()-30 DAYS),2)) concat
       digits(dec(day(now()-30 DAYS),2))
       and DATFLD <=
       digits(dec(year(now()),4)) concat 
       digits(dec(month(now()),2)) concat
       digits(dec(day(now()),2))

我能得到比这更高效的方法吗?

编写一个函数(UDF)在真实日期和 8 字节伪日期之间进行转换。类似这样:

CREATE FUNCTION GETMACHINEDT ( 
    IDATE DATE ) 
    RETURNS DECIMAL(8, 0)   
    LANGUAGE SQL 
    RETURN CAST ((YEAR(IDATE)) * 10000 + MONTH (IDATE) * 100 + DAY (IDATE) AS DECIMAL (8, 0)); 

然后你可以这样写你的查询:

Select DATFLD, GETMACHINEDAT(current date - 30 days)
From MyFile
Where DATFLD Between GETMACHINEDT(current date - 30 days) and
      GETMACHINEDAT(current date)