sql - IBM i Date Diff 与 CYYMMDD - 无法使用 DATE()

标签 sql date db2 ibm-midrange db2-400

(标题已编辑) 大家下午好!

使用 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/

相关文章:

mysql - 按列上的特定值分组以获得更快的执行时间 - SQL

linux - bash 脚本 - DB2 "db2 restore database"默认答案是

c# - 数据访问与 ViewModel 的 MVVM 分离

sql - RPG 编程中不允许使用 null 值吗?

SQL 查询,每个唯一二重奏的最新行

mysql - 选择个案/根据另一个字段更新一个字段

c# - 使用 C# 检查文本是否已存在于 SQL Server 中

ios - 如何使 NSCalendar 周从星期一而不是星期日开始

java - 将日期格式从 mm/dd/yyyy 转换为 MM DD, YYYY

r - 使用 fill 有条件地填充 NA 值,无需循环