(标题已编辑) 大家下午好!
使用 IBM i 版本 7.1 并希望计算查询中两个日期之间的差异。由于没有什么是容易的,一个日期采用 CYYMMDD 格式,另一个 (curdate()) 格式为 YYYY-MM-DD。我尝试将 CYYMMDD 格式的日期(字段名称 APENGD)转换为 varchar(10),然后将其包装在 CAST 中作为日期(因为小数不能转换为日期):
Cast(Cast(APENGD + 19000000 As varchar(10)) As date) As math
但无论出于何种原因,我只看到结果++++++++++++++
。我能够测试几个不同的版本,发现我无法在任何地方使用 DATE...任何人都可以建议替代方案吗?
提前致谢!
马特
最佳答案
仅当字符串包含分隔符时,才可以将 varchar 转换为日期。
在 7.1 中,您可以使用 TIMESTAMP_FORMAT()
,但您最终会得到一个时间戳,而不仅仅是一个日期。但这很容易解决。
Date(Timestamp_format(char(APENGD + 19000000),'YYYYMMDD')) As math
处理数字/字符值日期时我首选的解决方案是创建一个用户定义函数来处理转换。
您可以自己编写,也可以使用我编写的。 iDate由艾伦·坎平撰写。那么你的代码就很简单了:
idate(APENGD,'*CYMD') as nath
请注意,如果您尝试在 WHERE
子句中使用日期差异,如下所示
WHERE CURRENT_DATE - 3 months <= idate(APENGD,'*CYMD')
由于无法(直接)使用 APENGD 上的现有索引,因此上述方法的性能会很差。假设操作系统的最新版本(6.1+),您可以创建一个新索引,其中包含用于将 APENGD 转换为日期的表达式。
或者您可以使用 Alan 提供的 Date->Numeric 函数 ConvertToIdate
对其进行编码。这将允许使用现有索引。
WHERE ConvertToiDate(CURRENT_DATE - 3 months,'*CYMD') <= APENGD
关于sql - IBM i Date Diff 与 CYYMMDD - 无法使用 DATE(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38233551/