簡體   English   中英

DB2 / ODBC上的SQL中的日期算術

[英]Date arithmetic in SQL on DB2/ODBC

我正在構建一個針對DB2數據庫的查詢,通過IBM Client Access ODBC驅動程序進行連接。 我想根據字段'a.ofbkddt'來提取不到6天的字段...問題是該字段不是日期字段,而是DECIMAL字段,格式為YYYYMMDD。

我能夠通過將其包裝在對char()的調用中來細分十進制字段,然后使用substr()來提取年,月和日字段。 然后我將其格式化為日期,並調用days()函數,它給出了一個我可以執行算術運算的數字。

以下是查詢示例:

select
       days( current date) -
       days( substr(char(a.ofbkddt),1,4) concat '-'              -- YYYY-
             concat substr(char(a.ofbkddt),5,2) concat '-'       -- MM-
             concat substr(char(a.ofbkddt),7,2) ) as difference, -- DD
       a.ofbkddt as mydate
from QS36F.ASDF a

這產生以下結果:

difference  mydate
2402        20050402
2025        20060306
...
4           20110917
3           20110918
2           20110919
1           20110920

這是我期望看到的......但是當我在查詢的where子句中使用相同的邏輯時:

select
       days( current date) -
       days( substr(char(a.ofbkddt),1,4) concat '-'              -- YYYY-
             concat substr(char(a.ofbkddt),5,2) concat '-'       -- MM-
             concat substr(char(a.ofbkddt),7,2) ) as difference, -- DD
       a.ofbkddt as mydate
from QS36F.ASDF a
where
(
days( current date) -
days( substr(char(a.ofbkddt),1,4) concat '-'         -- YYYY-
      concat substr(char(a.ofbkddt),5,2) concat '-'  -- MM
      concat substr(char(a.ofbkddt),7,2) )           -- DD
) < 6

我不從我的查詢得到任何結果回來了,盡管很明顯, 越來越少1天(明顯高於經過6天,我在where子句中想申請更低)的日期差異。

我的第一個想法是,days()的返回類型可能不是整數,導致比較失敗...根據http://publib.boulder.ibm.com/iseries/上的 days()文檔v5r2 / ic2924 / index.htm?info / db2 / rbafzmst02.htm ,它返回一個bigint。 我將差異轉換為整數,只是為了安全,但這沒有效果。

你正在倒退這個。 您可以預先計算日期中的差異,而不是對表中的每個值使用函數(因此您可以將其與日期進行比較)。 在每一行上運行該功能都會花費你的資源 - 如果你可以在CURRENT_DATE操作,你會節省很多(如果你可以在你的應用程序代碼中執行它,它可能會節省更多,但我意識到這可能會不可能)。 畢竟,您的日期可排序的格式。

查詢如下所示:

SELECT ofbkddt as myDate
FROM QS36F.ASDF
WHERE myDate > ((int(substr(char(current_date - 6 days, ISO), 1, 4)) * 10000) +
                (int(substr(char(current_date - 6 days, ISO), 6, 2)) * 100) +
                (int(substr(char(current_date - 6 days, ISO), 9, 2))))

當針對您的示例數據表運行時,會產生以下結果:

myDate
=============
20110917
20110918
20110919
20110920

您可能還想查看創建日歷表,並將這些日期添加為其中一列。

如果您嘗試使用公用表表達式怎么辦?

WITH A AS
(
    select
       days( current date) -
       days( substr(char(a.ofbkddt),1,4) concat '-'              -- YYYY-
             concat substr(char(a.ofbkddt),5,2) concat '-'       -- MM-
             concat substr(char(a.ofbkddt),7,2) ) as difference, -- DD
       a.ofbkddt as mydate
    from QS36F.ASDF a
)
SELECT
    *
FROM
    a
WHERE
    difference < 6

你的數據在a.ofbkddt中是否有一些空值? 也許這會導致db2如何評估小於操作的一些有趣的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM