(编辑标题) 大家下午好!
使用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 ......有人可以提出替代方案吗?
提前致谢!
马特
答案 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'))
时间戳的字符串表示形式是以数字开头且长度至少为14个字符的字符或Unicode图形字符串。 ...
答案 2 :(得分:0)
如果要计算2个日期之间的差异,可以使用:
`TIMESTAMPDIFF(32, cast(MYTIMESTAMP1 - MYTIMESTAMP2 as char(22)))`
函数的第一个参数指定结果的类型。
1:毫秒 16:天 2:第二 32:一周 4分钟 64:月 8:小时 128:三个月 256:年