使用 SQL 和 DB2 for i 进行日期算术

Posted

技术标签:

【中文标题】使用 SQL 和 DB2 for i 进行日期算术【英文标题】:Date Arithmetic with SQL and DB2 for i 【发布时间】:2013-01-14 14:10:56 【问题描述】:

我正在尝试运行将更新特定表中信息的 SQL 查询。我遇到的问题是我需要查询来提取今天的日期,无论查询运行的日期是什么,然后只提取可以追溯到几年的记录。然后我希望它在这两年的时间段内返回 CUR_CASH_UNITS 的AVG。我已经尝试过 DATEDIFF 和 DATEADD ,但它们似乎不适用于我拥有的系统,因为它返回 *libl 错误。这是我所拥有的:

Select  Month,
    SSSALESNAM,
    CAT,
    Sum(Units) as Units     
From    DW****.******EG
Inner Join  (Select CAT,
                STORE,
                MONTH(DATE) As Month,
                Sum(CUR_CASH_UNITS) As Units
         From   DW*******.****AT        
         Inner Join (Select CAT,
                            CATNUM
                     From   DW****.*****ST) As Category_List             
        On         DW*******.****AT.CATEGORY_NUMBER=Category_List.CATNUM
        --Where  (((CUR_CASH_UNITS.MONTH(DATE)) Between MONTH(DATE) And (MONTH(DATE)-24MONTH))
        Group by Cat,
                 Store,
                 MONTH(DATE)) As Cash_Units

On          DW****.******EG.SSSTR=Cash_Units.STORE           
Group By    Month,
        SSSALESNAM,
        CAT
Order By    Month,
        SSSALESNAM

上面被注释掉的部分只是我试图让日期算术工作的尝试之一。使用Where 语句注释掉正确执行的查询。我表中的日期列标记为 DATE,格式为 YYYY-MM-DD。对 SQL 来说有点新,所以如果我忽略了一些简单的事情,我提前道歉。

【问题讨论】:

尽管如此,请永远不要使用BETWEEN,即使它确实适用于实际的日期列 - 你永远不知道该列何时会变成时间戳。实际上,“思考”日期通常是错误的方式(例如,如何在概念上处理它们),尤其是对于时间戳的东西。这就是为什么您应该使用下限包含 (>=)、上限排除 (<) 范围。 【参考方案1】:

我想你想要一个where 子句,如下所示:

where "date" between current date - 2 years and current date

您需要双引号,因为date 是保留字。剩下的只是为了得到过去两年的约会。

【讨论】:

DB2 for IBM i 7.1 Reference 如果您为列提供更具描述性的名称(例如 SalesDate),这将帮助您避免意外使用保留字以及其他好处。

以上是关于使用 SQL 和 DB2 for i 进行日期算术的主要内容,如果未能解决你的问题,请参考以下文章

DB2 for IBM i:缺少 sql_function

如何在 DB2 for Z/OS 中返回系统日期或日期时间?

日期格式:DB2 _ SQL

Informatica Cloud DB2 for i cdc 连接类型 SQL 覆盖不起作用

SQL DB2 如何将日期变量应用于内部查询?

实现 Java 存储过程 IBM DB2 for i (AS400)