[英]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.