在IBM iSeries SQL上,选择日期介于今天和30

时间:2015-09-11 14:57:53

标签: sql type-conversion ibm-midrange

在IBM iSeries SQL上,选择日期介于今天和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))

我可以比这更有效吗?

1 个答案:

答案 0 :(得分:1)

编写一个函数(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)