1

私はテーブルを持っていますwchihには2つの列があります。定義は

CREATE TABLE LOGGING_T
(
  TSTAMP  DATE,
  LINE    VARCHAR2(300)
)
TABLESPACE OPERATIONS
MONITORING
/

colulmn TSTAMPには、、...などの値があり30-NOV-11ます29-NOV-11。今、私はこのクエリを行っています

select * from LOGGING_T where TSTAMP >= (SYSDATE - 1)

現在のシステム日付は01-DEC-11です。30-NOV-11理想的には、上記のステートメントは、TSTAMP=を持つレコードを返す必要SYSDATE-1があります30-NOV-11。しかし、それはそれらのレコードをフェッチしていません。なんで?

ただし、このクエリを実行すると

select * from LOGGING_T where TSTAMP >= (SYSDATE - 2)

TSTAMP次に、であるレコードをフェッチします30-NOV-11。この単純な日付操作で何か間違ったことをしていますか?

4

2 に答える 2

1

値SYSDATEには、時間コンポーネントも含まれています。ほとんどの場合、データベースの日付にも時間コンポーネントがあります。

クエリを次のように変更します。

select * from LOGGING_T where TSTAMP >= TRUNC(SYSDATE - 1)

昨日の00:00からログに記録されたすべてのレコードを表示します。

実際の時間コンポーネントを確認するには、tocharを使用します。

SQL> select sysdate from dual;

SYSDATE
---------
01-DEC-11

  1* select to_char(sysdate,'DD-Mon-YYYY HH24:MI:SS') date1 from dual
SQL> /

DATE1
--------------------
01-Dec-2011 16:29:01
于 2011-12-01T21:29:20.107 に答える
1

ADATEには、時刻と日付が含まれます。

もしそうなら。SYSDATE_2011-12-01 1:18:00 PMSYSDATE-12011-11-30 1:18:00 PM

時間要素の前後の11月30日から検索する予定の行はありますか?

時間は気にせず、日付だけに基づいてフィルタリングしたい場合は、次を使用できますTRUNC()

select * 
  from LOGGING_T 
 where TRUNC(TSTAMP) >= TRUNC(SYSDATE - 1);

日付の時間要素を真夜中に強制するだけなので、比較演算子の両側がTRUNC()edであることを確認する場合としない場合があります。TRUNC()

select to_char(trunc(sysdate), 'YYYY-MM-DD HH:MI:SS PM') 
  from dual;

NOW
----------------------
2011-12-01 12:00:00 AM
于 2011-12-01T21:22:40.787 に答える