web-dev-qa-db-ja.com

DB2の2つの日付の間の日数を計算していますか?

DB2の2つの日付間の日数の違いを取得する必要があります。いくつかの異なるクエリを試しましたが、何も機能していないようです。だから基本的に私が得る必要があるのはこのようなものです.

 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';

どうぞよろしくお願いいたします。ありがとう

11
jorame

@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
12
Clockwork-Muse

私はJavaデスクトップアプリケーションのDerby IBM DB2組み込みデータベースで同じ問題に直面し、検索の1日後にようやくそれがどのように行われるかを見つけました:

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

詳細については このサイトを確認してください

3
E_X
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

---------- EDIT BY galador

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

[〜#〜]編集[〜#〜]

X-Zeroで指摘されているように、この関数は推定値のみを返します。これは本当です。正確な結果を得るには、次のようにして、2つの日付aとbの間の日数の差を取得します。

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

,right(a2.chdlm,2)))) from sysibm.sysdummy1 a1,に閉じ括弧が1つ欠けているようです

したがって、クエリは

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
Siva Charan

それだけではないでしょう:

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

DB2で日付計算がどのように機能するかを理解していれば、2つの日付の間の日数が返されます。

CHDLMが日付でない場合は、日付に変換する必要があります。 IBMによると、DATE()関数はyyyymmdd形式には不十分ですが、yyyy-mm-ddのような形式にできれば機能します。

0
David Faber