2012-09-03 24 views
5

次のように私は、私のタイムスタンプに基づいてデータを取得する単純なクエリを実行しようとしています:DB2のタイムスタンプselect文

SELECT * 
FROM <table_name> 
WHERE id = 1 
AND usagetime = timestamp('2012-09-03 08:03:06') 
WITH UR; 

これは私にレコードを返すようには思えないこのレコードが中に存在しているのに対し、 id = 1のデータベース

私はここで間違っていますか?

カラムusagetimeのデータ型は、タイムスタンプに設定されています。

+2

タイムスタンプならびに、第二の画分を有します。私はそれがあなたの問題だと思っています、私はあなたの選択した声明でそれらが表示されません。 – bhamby

答えて

17

@bhambyが正しいです。マイクロ秒をタイムスタンプ値から離しておくと、クエリはUsagTimeの2012-09-03にのみ一致します。2012-09-03 08:03:06.000000

以前のクエリから取得した完全なタイムスタンプ値がない場合、その時間の間の任意のマイクロ秒の値に一致する範囲述語を指定することができる:

...WHERE id = 1 AND usagetime BETWEEN '2012-09-03 08:03:06' AND '2012-09-03 08:03:07' 

又は

...WHERE id = 1 AND usagetime >= '2012-09-03 08:03:06' 
    AND usagetime < '2012-09-03 08:03:07' 
+1

タイムスタンプ値(あなたがあなたの質問で適切に行った)の受け入れ可能な文字列表現を指定するときに、TIMESTAMP()の呼び出しが不要であることを指摘したいと思います。 –

+1

特にBETWEENは決して使用しないでください。特に日付/時刻/タイムスタンプを扱うときには使用しないでください。一つは、あなたの2つの 'WHERE'節は**同等**ではありません。 –

+1

あなたは正しいです。 'BETWEEN'条件には次の秒が含まれますが、2つの比較では次の秒が除外されます。 「BETWEEN」を使用するもう一つの欠点は、少なくとも古いバージョンのDB2では、クエリオプティマイザが、2つの明示的な範囲比較よりも効率の悪いアクセスプランを選択することが判明していることです。 –