web-dev-qa-db-ja.com

Oracle:昨日からのみレコードを選択できますか?

この質問の答えを見つけるためにウェブを検索するのに何時間も費やしました...

現在私が持っているものは次のとおりです。

select  *
from    order_header oh
where   tran_date = sysdate-1

前もって感謝します。

37
Keith Myers

つかいます:

AND oh.tran_date BETWEEN TRUNC(SYSDATE - 1) AND TRUNC(SYSDATE) - 1/86400

参照: [〜#〜] trunc [〜#〜]

tran_dateで関数を呼び出すと、オプティマイザーはそれに関連付けられたインデックス(存在する場合)を使用できなくなります。 Oracleなどの一部のデータベースは、そのような状況での影響を最小限に抑えるためにデータに対して関数を実行できる関数ベースのインデックスをサポートしていますが、IME DBAはこれらを許可しません。そして、私は同意します-彼らはこの例では本当に必要ではありません。

67
OMG Ponies
trunc(tran_date) = trunc(sysdate -1)
16
Henry Gao
to_char(tran_date, 'yyyy-mm-dd') = to_char(sysdate-1, 'yyyy-mm-dd')
2

このコメントは、このエントリを見つけたがOracleではなくmysqlを使用している読者向けです。 mysqlでは、次のことができます。Today

SELECT  * 
FROM 
WHERE date(tran_date) = CURRENT_DATE()

昨日

SELECT  * 
FROM yourtable 
WHERE date(tran_date) = DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)
1
netsuvi

将来の日付のトランザクションをサポートしない場合、このような何かが動作する可能性があります:

AND oh.tran_date >= trunc(sysdate-1)
1
ninesided

昨日のタイムスタンプが必要な場合は、次のようにします。

(CURRENT_TIMESTAMP - INTERVAL '1' DAY)
0
Aliuk