IBM i (AS400/ISeries) - 在 WRKQRY 中添加天数到日期字段

IBM i (AS400/ISeries) - Adding days to date field in WRKQRY

我有一个 YYYYMMDD 格式的十进制日期字段 (TDDATR)。

我想创建一个 TDDATR + 30 天的字段,但我做不到。

使用 'Define Results Field' 我尝试了一些东西;

  1. 就是这样做;

TDDATR + 30 天

但它返回了这个错误:未正确使用标记的持续时间。

  1. 我尝试使用 DIGITS 和 SUBSTR 命令以 DDMMYYYY 格式创建一个字段,然后又过了 30 天,但出现了同样的错误。

  2. 与上面相同,但采用 DD/MM/YYYY 格式 - 同样的错误。

  3. 使用 DATE(TDDATR),但我只看到该字段中的 +。

  4. 在步骤 2 和 3 中创建的字段上使用 DATE( ) - 仍然得到 +'s

我 运行 没有想法 - 任何帮助将不胜感激。

Query/400 缺少基于 SQL 的界面所具有的许多功能。

我建议您考虑改用查询管理器 (STRQM),这是一个完全基于 SQL 的产品。通过将 ALWQRYDFN 参数设置为 *YES,您甚至可以使用 RTVQMQRY 命令将 Query/400 查询转换为查询管理器查询。

IBM 正在推动的另一个选择是 Web 查询。同样,完全基于 SQL,您可以将 Query/400 查询转换为它。

话虽如此,问题是 FLD + 30 DAYS 仅在 FLD 是 DATE 数据类型时才有效。 Query/400 包含一个 DATE() 函数,用于将非日期类型转换为日期。但它非常有限,因为它仅适用于根据您的作业默认设置格式化的字符字段。假设您在美国,它只适用于字符值“07/01/15”。

您可以在 Query/400 中进行大量操作并最终得到满足 DATE() 要求的结果字段。但更好的解决方案是在 table 上创建一个 SQL 视图,并将数字日期转换为视图中的日期数据类型。

您可以找到说明如何在视图中将数字 YYYYMMDD 转换为实际日期数据类型的代码示例。但是,我建议创建一个用户定义函数 (UDF) 来为您进行转换。这将使它更容易在视图中使用并在其他地方重用。

如果您愿意,可以使用一个名为 iDate 的开源包,其中包含转换 to/from 日期数据类型所需的所有代码。

下载它,install/compile 它和您的 SQL 视图变成

select ... idate(TDDATR,'*CCYMD') as TD_DATE
from myfile

天数的使用如下

Field       Expression                       
CURDATE_30  days(current(date)) + 30         

你的问题的解决方案是:给定字段 A dec(8,0)

Field       Expression                       
YYYYMMDD_   date(substr(digits(a),5,2)||'/'||
             substr(digits(a),7,2)||'/'||
             substr(digits(a),3,2))      

NEXT_MONTH  DAYS(YYYYMMDD_) + 30              

记得检查职位描述中的日期格式。在示例中,格式为 MDY 或 MM/DD/YY.

More info here

根据信息 here,我创建了以下 2 个字段;

TDDIGI  DIGITS(TDDATR)           

TDDAT1  SUBSTR(TDDIGI,7,2)||'/'||
        SUBSTR(TDDIGI,5,2)||'/'||
        SUBSTR(TDDIGI,3,2)           

从这里我可以创建一个日期字段;

TDDAT2      DATE(TDDAT1)

这让我可以进行必要的计算。

TDDAT1 的格式基于您的职位描述,可以通过以下方式找到;

  • 工作
  • 选项 2
  • 向下翻页
  • 日期格式..: X

我的是*DMY,所以TDDAT1就是根据这个格式化的。