在 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)
在 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)