1

私のクエリでは、現在ユーザーに日時を入力させています。

現在のクエリ

where TableT.STARTDATETIME  >= To_Date('?DATE1?','MM-DD-YYYY HH24:MI:SS')
          and TableT.STARTDATETIME <= To_Date('?DATE2?','MM-DD-YYYY HH24:MI:SS') 

ユーザーは
、Date110-02-2013 00:00:00
に対して、Date2 に対して10-02-2013 23:59:59

パラメータ:- ?DATE? &DATE2は、ユーザーが日付を入力するための単なるパラメーターです。

から始まる昨日
の日付をSQLに自動的に入力させるにはどうすればよいですか?00:00:0023:59:59

次のようなものを使用できることは知っていますが、わかりsysdate-1ません。

4

2 に答える 2

4

あなたが使用することができます

TRUNC(TableT.STARTDATETIME) = TRUNC(sysdate-1)

この目的のために、小切手の両側で両方の日付をその日に切り捨てます。ただし、これを効率的に行うには、 に関数インデックスが必要ですTRUNC(TableT.STARTDATETIME)

パフォーマンスの観点から、一般的にはより良いかもしれません:

TableT.STARTDATETIME >= trunc(sysdate-1) AND TableT.STARTDATETIME < trunc(sysdate);

これには、昨日の 00:00:00 ( >=) が含まれますが、今日の 00:00:00 ( <) は含まれません。

警告!列についてTIMESTAMPは、その単純さのために魅力的ですが、との間の 1 秒のタイムスロットにもデータが含まれている可能性があるため、終了時間として使用しないでください。このギャップにより、それらは処理されなくなります...23:59:5923:59:5900:00:00

于 2013-10-03T16:09:55.770 に答える
4

それはそのようになります:

where TableT.STARTDATETIME >= trunc(sysdate-1) and
      TableT.STARTDATETIME <  trunc(sysdate)

列の値自体を切り捨てることは避けてください。Trunc(TableT.STARTDATETIME) にインデックスを配置することはできますが、時間ベースのクエリをサポートするには別のインデックスが必要になります。これは、オプティマイザーから値の分布をわかりにくくする良い方法です。

日付とタイムスタンプの演算の詳細については、こちらをご覧ください。日付を操作するその他の便利な方法については、 Trunc(datetime, format)関数をご覧ください。

于 2013-10-03T16:10:32.260 に答える