2012-03-02 507 views
7

我需要得到DB2中兩個日期之間的差異。我嘗試了幾個不同的查詢,但似乎沒有任何工作。所以基本上我需要得到的是這樣的。計算DB2中兩個日期之間有多少天?

SELECT DAYS (CURRENT DATE) - DAYS (DATE(CHDLM)) FROM CHCART00 WHERE CHSTAT = '05'; 

我知道,如果我刪除CHDLM並指定像「2012-02-20」日期它的工作原理,但我需要能夠對錶中的那場運行此。我也嘗試由朋友給我的這個查詢也不起作用。

select days (current date) - days (date(select concat(concat(concat(concat(left(a2.chdlm,4),'-'),substr(a2.chdlm,4,2)),'-'),right(a2.chdlm,2))) from sysibm.sysdummy1 a1, chcart00 a2 where chstat = '05'; 

請任何幫助將不勝感激。由於

+0

看起來您的列數據類型存在問題... – Teja 2012-03-02 18:56:44

回答

8

我認爲@Siva是在正確的軌道上(使用DAYS()),但嵌套CONCAT() s讓我頭暈。這是我的要求。
哦,參考sysdummy1毫無意義,因爲無論如何您都需要從表格中拉出。
另外,不要使用隱式連接語法 - 它被認爲是SQL反模式。

爲了便於閱讀,我在這裏將日期轉換封裝在CTE中,但沒有什麼能夠阻止您將其內聯。

WITH Converted (convertedDate) as (SELECT DATE(SUBSTR(chdlm, 1, 4) || '-' || 
               SUBSTR(chdlm, 5, 2) || '-' ||  
               SUBSTR(chdlm, 7, 2)) 
            FROM Chcart00 
            WHERE chstat = '05') 

SELECT DAYS(CURRENT_DATE) - DAYS(convertedDate) 
FROM Converted 
+0

謝謝 – jorame 2012-03-06 21:39:24

+0

對不起,還有一個問題,如果我需要從CHCART00表中選擇更多的字段,我該怎麼做呢? – jorame 2012-03-06 21:50:03

+0

沒關係,我弄明白了。謝謝 – jorame 2012-03-06 22:15:32

0
values timestampdiff (16, char( 
    timestamp(current timestamp + 1 year + 2 month - 3 day)- 
    timestamp(current timestamp))) 
1 
= 
422 



values timestampdiff (16, char( 
    timestamp('2012-03-08-00.00.00')- 
    timestamp('2011-12-08-00.00.00'))) 
1 
= 
90 

---------- 編輯由galador

SELECT TIMESTAMPDIFF(16, CHAR(CURRENT TIMESTAMP - TIMESTAMP_FORMAT(CHDLM, 'YYYYMMDD')) 
FROM CHCART00 
WHERE CHSTAT = '05' 

編輯

正如有人所指出的X-Zero的,這個功能只返回估計值。這是真的。爲了獲得準確的結果,我會使用以下方法來獲取之間兩個日期a和b在天的區別:在,right(a2.chdlm,2)))) from sysibm.sysdummy1 a1,

SELECT days (current date) - days (date(TIMESTAMP_FORMAT(CHDLM, 'YYYYMMDD'))) 
FROM CHCART00 
WHERE CHSTAT = '05'; 
+0

我該如何在我的查詢中實現這個功能? – jorame 2012-03-02 19:09:27

+0

我添加了一個查詢,我想應該得到你想要的東西(假設'CHDLM'是一個日期或時間戳類型或格式正確的字符串)。 – bhamby 2012-03-02 19:31:02

+0

CHDLM的格式與yyyymmdd相似,你認爲這個查詢可以用嗎? – jorame 2012-03-02 19:37:43

0

這似乎是一個右括號缺少這樣你的查詢將被

select days(current date) - days(date(select concat(concat(concat(concat(left(a2.chdlm,4),'-'),substr(a2.chdlm,4,2)),'-'),right(a2.chdlm,2)))) from sysibm.sysdummy1 a1, chcart00 a2 where chstat = '05'; 
+0

不工作,我得到一個「令牌CONCAT無效。有效令牌:(,」錯誤。 – jorame 2012-03-02 19:09:06

0

豈不只是:

SELECT CURRENT_DATE - CHDLM FROM CHCART00 WHERE CHSTAT = '05'; 

那那麼r如果我理解日期運算在DB2中的正確工作方式,那麼請修改這兩個日期之間的天數。

如果CHDLM不是日期,則必須將其轉換爲一個日期。根據IBM的說法,DATE()函數對於yyyymmdd格式來說是不夠的,但如果可以像這樣格式化,那麼它將工作:yyyy-mm-dd。

+0

任何想法如何格式化日期? – jorame 2012-03-02 20:06:19

+0

不幸的是,這些操作的結果是_indefinite period_ (即2個月,3天),即使起始格式是有效的,OP會特別要求天數 – 2012-03-02 23:34:34

+0

啊,我的歉意,應該是DAYS(CURRENT_DATE) - DAYS(CHDLM) – 2012-03-03 03:41:02

2

我面臨德比IBM DB2在Java桌面應用程序的嵌入式數據庫同樣的問題,並搜索了一天後,我終於找到了它是如何做:

SELECT days (table1.datecolomn) - days (current date) FROM table1 WHERE days (table1.datecolomn) - days (current date) > 5 

瞭解更多信息check this site

+1

這隻會工作如果已知日期總是在同一個月份('day'只是返回日期字段)使用'days'應該適用於一般情況,因爲它返回da自從這個時代以來。 – 2015-12-29 20:32:04

相關問題