带有CYYMMDD的IBM i Date Diff - 无法使用DATE()

时间:2016-07-06 20:49:29

标签: sql date db2 ibm-midrange db2-400

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

使用IBM i版本7.1并查看计算查询中两个日期之间的差异。由于一切都不容易,一个日期是CYYMMDD格式,另一个日期(curdate())是YYYY-MM-DD。我试图将我的CYYMMDD格式化日期(字段名称APENGD)作为varchar(10),然后将其作为日期包装在CAST中(因为小数不能作为日期进行CAST):

Cast(Cast(APENGD + 19000000 As varchar(10)) As date) As math

但我只是因为某种原因才看到结果++++++++++++++。我能够测试这个的几个不同版本,发现我不能在任何地方使用DATE ......有人可以提出替代方案吗?

提前致谢!

马特

3 个答案:

答案 0 :(得分:3)

将varchar转换为日期仅在字符串包含分隔符时才有效。

在7.1,您可以使用item,但最终会得到时间戳,而不仅仅是日期。但这很容易处理。

TIMESTAMP_FORMAT()

处理数字/字符值日期时,我首选的解决方案是创建用户定义函数来处理转换。

您可以自己编写,也可以使用我自己编写的。 iDate由Alan Campin撰写。然后你的代码很简单:

Date(Timestamp_format(char(APENGD + 19000000),'YYYYMMDD')) As math

请注意,如果您尝试在 idate(APENGD,'*CYMD') as nath 子句中使用日期差异,请执行此操作

WHERE

由于无法直接使用APENGD上的现有索引,因此上述情况表现不佳。假设最近(6.1+)版本的操作系统,您可以创建一个新索引,其中包含您用于将APENGD转换为日期的表达式。

或者您可以使用Alan帮助包含的Date-&gt; Numeric函数WHERE CURRENT_DATE - 3 months <= idate(APENGD,'*CYMD') 对其进行编码。这将允许使用现有索引。

ConvertToIdate

答案 1 :(得分:1)

未提供DDL [定义列APENGD]。无论如何,因为以下内容应该足够,主要是无论定义如何;要么是字符串,要么是零刻度数字。效果取决于14字符的SQL识别[最多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

  

时间戳的字符串表示形式是以数字开头且长度至少为14个字符的字符或Unicode图形字符串。 ...

答案 2 :(得分:0)

如果要计算2个日期之间的差异,可以使用:

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

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

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

相关问题