DB2 for IBM i (iSeries) 日期 - 需要比较(当前日期 - 1)

Posted

技术标签:

【中文标题】DB2 for IBM i (iSeries) 日期 - 需要比较(当前日期 - 1)【英文标题】:DB2 for IBM i (iSeries) Date - Need to Compare (Current Date - 1) 【发布时间】:2015-07-23 16:37:16 【问题描述】:

我是 DB2 for IBM i (iSeries) 语法的新手。我想将表中的日期字段与昨天的日期(当前日期 - 1)进行比较以进行审计。但是,我无法让它工作。我收到“[SQL0182] 日期、时间或时间戳表达式无效”错误。任何帮助是极大的赞赏。请参阅下面的代码。

SELECT DECIMAL_FIELD
 FROM SCHEMA.TABLE
  WHERE DATE(INSERT(INSERT(DIGITS(DECIMAL_FIELD), 5, 0, '-'), 8, 0, '-')) > DATE(VARCHAR_FORMAT(TIMESTAMP_ISO(CURRENT DATE), 'YYYY-MM-DD')) - 1
AND DECIMAL_FIELD <> 0

【问题讨论】:

究竟是什么不起作用?您可以提供错误消息吗? 是的,我得到“[SQL0182] 日期、时间或时间戳表达式无效。”当我添加“- 1”时。 【参考方案1】:

指定持续时间。

SELECT DECIMAL_FIELD
FROM SCHEMA.TABLE
WHERE DATE(INSERT(INSERT(DIGITS(DECIMAL_FIELD), 5, 0, '-'), 8, 0, '-')) >
    DATE(VARCHAR_FORMAT(TIMESTAMP_ISO(CURRENT DATE), 'YYYY-MM-DD')) - 1 DAY
    AND DECIMAL_FIELD <> 0

也可以简化比较:

SELECT DECIMAL_FIELD
FROM SCHEMA.TABLE
WHERE DATE(INSERT(INSERT(DIGITS(DECIMAL_FIELD), 5, 0, '-'), 8, 0, '-')) >
    CURRENT_DATE - 1 DAY
    AND DECIMAL_FIELD <> 0

Datetime arithmetic in SQL

【讨论】:

@Toya - 当然,为了能够在DECIMAL_FIELD 上使用索引(这是一个与日期相关的可怕名称......) ,最好以另一种方式进行转换,并从CURRENT_DATE 构造一个可比较的值。那,并使用一个包容性的下限。 对上述查询的以下修订定义了一个表达式,该表达式用作有效文字,一个 constructed 值类型兼容,作为大于谓词的比较值与'DECIMAL_FIELD' 列,因此允许在该列上使用非派生索引: SELECT DECIMAL_FIELD FROM SCHEMA.TABLE WHERE DECIMAL_FIELD > DECIMAL( VARCHAR_FORMAT(TIMESTAMP_ISO(CURRENT DATE - 1 DAY), 'YYYYMMDD'), 8 ) /*用于匹配 DECIMAL_FIELD 的 type\len 的十进制转换标量 */ AND DECIMAL_FIELD 0

以上是关于DB2 for IBM i (iSeries) 日期 - 需要比较(当前日期 - 1)的主要内容,如果未能解决你的问题,请参考以下文章

IBM iSeries / AS 400中的DB2连接字符串

C# - 无法将类型“IBM.Data.DB2.iSeries.iDB2DataReader”隐式转换为“System.Data.SqlClient.SqlDataReader”

使用 IBM DB2 Connect 驱动程序调用 i 系列上的存储过程

将 PHP 连接到 IBM i (AS/400)

如何将数据从 ms-access 或 excel 导出到 IBM DB2 I-Series 数据库?

DB2 for IBM i:缺少 sql_function