IBM i Date Diff with CYYMMDD - 不能使用 DATE()

IBM i Date Diff with CYYMMDD - can't use DATE()

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

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

我在处理 numeric/character 值日期时首选的解决方案是创建一个用户定义函数来处理转换。

你可以自己写,也可以用我做的。 iDate 作者:Alan Campin。那么您的代码将很简单:

   idate(APENGD,'*CYMD') as nath

请注意,如果您尝试在 WHERE 子句中使用日期差异,例如

WHERE CURRENT_DATE - 3 months <= idate(APENGD,'*CYMD') 

由于无法(直接)使用 APENGD 上的现有索引,因此上述内容的效果会很差。假设 OS 的最新 (6.1+) 版本,您可以创建一个新索引,其中包含用于将 APENGD 转换为日期的表达式。

或者您可以使用 Date->Numeric 函数 ConvertToIdate 对其进行编码,Alan 提供了帮助。这将允许使用现有索引。

WHERE ConvertToiDate(CURRENT_DATE - 3 months,'*CYMD') <= APENGD

如果你想计算两个日期之间的差异,你可以使用:

`TIMESTAMPDIFF(32, cast(MYTIMESTAMP1 - MYTIMESTAMP2 as char(22)))`

函数的第一个参数指定结果的类型。

1:毫秒 16:天 2:第二 32:周 4:分钟 64 : 月 8:小时 128:三个月 256:年

未提供 DDL [以定义列 APENGD]。没关系,因为以下内容就足够了,主要与定义无关;作为字符串或作为零比例数字。效果取决于 SQL 将 14 个字符 [最多 26 个字符,因为某些 v7 版本] 字符串识别为未格式化 [即缺少任何定界符,因此只有数字] TIMESTAMP 表示:

date(timestamp((APENGD + 19000000) concat '000000'))

IBM i 7.3->Database->Reference->SQL reference->Language elements->Data types->Datetime values->String representations of datetime values->Timestamp strings

A string representation of a timestamp is a character or a Unicode graphic string that starts with a digit and has a length of at least 14 characters. …