TIMESTAMP_FORMAT 不使用 DB2 中的 OFFSET

TIMESTAMP_FORMAT not working with OFFSET in DB2

我正在尝试在 DB2 中进行分页。我不想用子查询来做,但是 OFFSET 不适用于 TIMESTAMP_FORMAT.

Use of function TIMESTAMP_FORMAT in QSYS2 not valid. Data mapping error on member

我发现了这个问题,但问题似乎出在列的内容上,这不是我的情况,因为值没问题,而且 TIMESTAMP_FORMAT 在没有 OFFSET 的情况下也能工作。 我没有寻找其他不使用 TIMESTAMP_FORMAT 的方法,因为我需要为不是由我而是由客户编写的查询创建分页。

查询看起来像这样。

SELECT DATE(TIMESTAMP_FORMAT(CHAR("tablename"."date"),'YYMMDD')) 
FROM tableName
OFFSET 10 ROWS

我明白了

"[SQL0583] Use of function TIMESTAMP_FORMAT in QSYS2 not valid."

我不确定 OFFSET 与 TIMESTAMP_FORMAT 有何关联,但是当我将 select 替换为 select * 时,它工作正常。

我想知道为什么 OFFSET 和 TIMESTAMP_FORMAT 之间有冲突,有没有办法不用子查询绕过它。

我怀疑你的问题错误数据...

IBM 交互式工具 STRSQL 和 ACS 运行 SQL 脚本的默认设置是 OPTIMIZE(*FIRSTIO),这意味着尽快返回前几行...

使用 OFFSET 10 子句,您最初可能会访问以前没有访问过的行。

尝试以下方法

create table mytest as (
  SELECT DATE(TIMESTAMP_FORMAT(CHAR("tablename"."date"),'YYMMDD')) as mydate
FROM tableName
) with data

如果没有错误,那么是的,你发现了一个错误,打开一个 PMR。

否则,您可以通过查看新 table 中的行并跟踪包含错误数据的记录来了解 DB 走了多远。

来自Listing of SQL Messages

SQL0583
Function &1 in &2 cannot be invoked where specified because it is defined to be not deterministic or contains an external action.
Functions that are not deterministic cannot be specified in a GROUP BY clause or in a JOIN clause, or in the default clause for a global variable.
Functions that are not deterministic or contain an external action cannot be specified in a PARTITION BY clause or an ORDER BY clause for an OLAP function and cannot be specified in the select list of a query that contains an OFFSET clause.
The RAISE_ERROR function cannot be specified in a GROUP BY or HAVING clause.

我不知道如何检查 QSYS2.TIMESTAMP_FORMAT 函数的这些属性(在 QSYS2.SYSROUTINES table 中没有它的定义),但看起来不正确的定义此函数 - 没有理由将其创建为 not deterministicexternal action.
您可以像这样 "deceive" DB2:

CREATE FUNCTION MYSCHEMA.TIMESTAMP_FORMAT(str VARCHAR(4000), fmt VARCHAR(128))
RETURNS TIMESTAMP
DETERMINISTIC
CONTAINS SQL
NO EXTERNAL ACTION
RETURN QSYS2.TIMESTAMP_FORMAT(str, fmt);

SELECT 
DATE(MYSCHEMA.TIMESTAMP_FORMAT(CHAR(tablename.date), 'YYMMDD')) 
--DATE(QSYS2.TIMESTAMP_FORMAT(CHAR(tablename.date), 'YYMMDD')) 
FROM table(values '190412') tableName(date)
OFFSET 10 ROWS;

并改用此功能。它至少适用于我的 7.3。
这是一种无害的欺骗,您可以要求 IBM 支持人员澄清 QSYS2.TIMESTAMP_FORMAT 的 "feature"...