【问题标题】:IBM i Date Diff with CYYMMDD - can't use DATE()IBM i Date Diff with CYYMMDD - 不能使用 DATE()
【发布时间】:2016-07-06 20:49:28
【问题描述】:

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

使用 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...有人可以提出替代方案吗??

提前致谢!

马特

【问题讨论】:

  • 您打算如何计算 DB2 上的差异?我知道没有任何好的内置函数,TIMESTAMPDIFF is almost useless.(因为前面的日期数学)。此外,使用列之间的差异通常会导致索引被忽略(因为它需要每行评估信息) - 您打算如何处理差异?

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


【解决方案1】:

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

在 7.1 中,您可以使用 TIMESTAMP_FORMAT(),但您最终会得到时间戳,而不仅仅是日期。但这很容易解决。

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

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

你可以自己写,也可以用我写的。 iDate 由 Alan Campin 撰写。那么你的代码很简单:

   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

【讨论】:

  • 谢谢你,查尔斯! TIMESTAMP_FORMAT 解决方案完美运行。
  • WHERE 子句在将 APENGD 转换为 DATE 形式的 表达式 上使用 INDEX 可能会更好地执行。从 i 6.1 开始,INDEX 允许使用 表达式。尝试做一个好的。
【解决方案2】:

未提供 DDL [定义列 APENGD]。无论如何,以下就足够了,主要与定义无关;作为字符串或零刻度数字。效果取决于 SQL 将 14 个字符 [最多 26 个字符,因为某些 v7 版本] 字符串识别为未格式化的 [i.e.缺少任何分隔符,因此只有数字] 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

时间戳的字符串表示是一个字符或 Unicode 图形字符串,它以数字开头,长度至少为 14 个字符。 …

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

    • 请不要使用TIMESTAMPDIFF(或者实际上是时间戳减法):它根据估计计算结果,这会在你最不期望的时候抛出结果,如I explain here。跨度>
    • 我不知道,谢谢 ;)
    猜你喜欢
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2016-10-25
    • 1970-01-01
    • 2022-12-19
    • 1970-01-01
    相关资源
    最近更新 更多