在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))
我可以比这更有效吗?
答案 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)