web-dev-qa-db-ja.com

DB2の日付の比較

DB2テーブルにDB2 DATEタイプのフィールドがあります。日付フィルターでデータを選択したい。例えば:

SELECT *
FROM   table
WHERE registrationdate > '2002-10-01';

上記のクエリから、registrationdateが '1943-10-01'から始まるレコードを取得しましたが、これは正しくありません。

これらも機能しません:

registrationdate > date('2002-10-01')
date(registrationdate) > date('2002-10-01')
date(registrationdate) > '2002-10-01'

日付を比較するにはどうすればよいですか?

13
yons88

私はデータベースに関する他のいくつかの問題を調査しました、再起動後にそれが機能し始めたので、これは今は正しく機能します:

registrationdate > '2002-10-01'
4
yons88

DATEリテラルのSQL標準形式は次のとおりです。

DATE '2002-10-01'

少なくとも、試してみる価値はあります。

SELECT *
  FROM table
 WHERE registrationdate > DATE '2002-10-01';
15

日付に使用されるデフォルトの形式は、DB2データベース(データベースの作成時に指定できます)の地域コードによって決まります。たとえば、私のデータベースはterritory = USを使用して作成されました。したがって、日付形式は次のようになります。

values current date 
1 
---------- 
05/30/2003 

1 record(s) selected.

DB CFGからテリトリーコードを取得できます。

db2 get db cfg | egrep 'code|territory'
 Database territory                                      = US
 Database code page                                      = 1208
 Database code set                                       = UTF-8
 Database country/region code                            = 1

つまり、形式はMM/DD/YYYYです。形式を変更する場合は、db2ユーティリティパッケージのコレクションをバインドして、別の日付形式を使用できます。

SQLを使用して現在の日付、時刻、およびタイムスタンプを取得するには、(基本的に日付形式が何かがわかる)適切なDB2レジスタを参照します。sysibm.sysdummy1テーブルは特別なメモリ内ですDB2レジスターの値を検出するために使用できるテーブル

db2 "SELECT current date FROM sysibm.sysdummy1 "

1
----------
06/02/2014

  1 record(s) selected.

関数の引用符を省略しても、DATE関数は機能しますが、結果は正しくありません。

db2 "SELECT date(2001-09-22) FROM sysibm.sysdummy1 "

1
----------
05/24/0006

  1 record(s) selected.

DATE関数は、入力として文字ストリングを取得すると、それがDB2日付の有効な文字表現であると想定し、それに応じて変換します。対照的に、入力が数値の場合、関数は、それが現在の時代の始まりからの日数から1を引いたもの(つまり、0001-01-01)を表すと想定します。上記のクエリでは、入力は2001-09-22で、(2001-9)-22は1970日です。

上記すべてが当てはまる場合は、以下のコマンドで問題が解決するはずです。

SELECT * FROM table WHERE registrationdate > '10/01/2002';

3
ultimatum

この形式を使用します。

registrationdate > 'mm/dd/yyyy'
2
Dhanish Jose