Informix - 跨多列和多行查询最新日期

问题描述 投票:0回答:1

我需要从 Informix 数据库中的多个数据库列(date_entered、date_updated)获取最新日期。从逻辑上讲, date_updated 应该始终是最新的,但在此数据中并非如此,因此我必须检查哪个是最新的。两列都支持并包含空值。在某些情况下,两者都为空,因此我也必须为它们提供默认的“低”日期。

最重要的是,我还需要获取共享相同组号的 n 记录的最新结果。

我编写了以下 SQL 来执行此操作:

SELECT  group_number, record_number, date_entered, date_updated
     , (SELECT MAX(CASE
        WHEN sq1.date_updated IS NOT NULL AND sq1.date_updated>=sq1.date_entered THEN sq1.date_updated
        WHEN sq1.date_entered IS NOT NULL THEN sq1.date_entered
        --ELSE TO_DATE('1950-01-01 00:00', '%Y-%m-%d %H:%M')
        END) FROM reports sq1 WHERE sq1.group_number=reports.group_number) AS date_latestupdate
FROM reports

这是我期望得到的,并且适用于两个日期不为空的情况:

组号 记录_编号 输入日期 更新日期 日期_最新更新
4972 1 2007-06-20 11:59:00.0 2007-06-22 13:25:15.0 2007-07-26 20:53:15.0
4972 2 2007-06-21 11:59:00.0 2007-07-26 20:53:15.0 2007-07-26 20:53:15.0
4972 3 2007-06-22 11:59:00.0 2007-06-26 19:40:15.0 2007-07-26 20:53:15.0

但是,case 语句的 ELSE 部分被注释掉,如果两列都为空,则无法提供日期。如果我取消注释,我会得到以下信息:

错误:CASE表达式中对应的类型必须兼容。
SQL状态:IX000
错误代码:-800

date_entered 和 date_updated 列的类型为 datetime,并且 Informix 文档说 TO_DATE 返回日期时间值 (https://www.ibm.com/docs/en/informix-servers/12.10?topic=dcf-date-函数-1)。 如果我单独查询其中的 to_date 函数,它似乎会生成一个日期时间值。

我尝试寻找其他方法来转换、转换等日期时间值,但我能找到的 Informix 强制数据类型的唯一方法是 TO_DATE 函数。

sql datetime case informix
1个回答
0
投票

在-800错误的文本描述中提到WHEN子句的所有结果值应该是兼容的数据类型,这包括ELSE子句。尽管 TO_DATE 函数的数据类型也是日期时间,但它的精度或大小与 WHEN 子句不同。 TO_DATE 函数将返回最大精度,即 YEAR 到 FRACTION(5)。 如果您转换 TO_DATE 函数的结果以匹配 WHEN 子句,那么它应该可以工作:

...
ELSE TO_DATE('1950-01-01 00:00', '%Y-%m-%d %H:%M')::datetime year to second
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.