1

これら 2 つの select クエリの理由

create table tmp (d date);
insert into tmp (d) values (sysdate);

select * from tmp where d = sysdate;
select * from tmp where d = trunc(sysdate);

どちらも0行を返しますか?

select to_timestamp(d), to_timestamp(sysdate) from tmp;

両方の列が等しいことを明確に示しています。

TO_TIMESTAMP(D)             | TO_TIMESTAMP(SYSDATE)
July, 01 2013 00:00:00+0000 | July, 01 2013 00:00:00+0000

SQL フィドルの例

4

2 に答える 2

3

1 秒の精度の時間コンポーネントが含まれているため、時刻付きINSERTの日付を追加しました。SYSDATE

最初SELECTは何も返されませんでした。これを実行するまでに、 を実行したときの値SYSDATEよりも 1 秒以上古い別の値があったためです。SYSDATEINSERT

SELECT時刻がなかったため、2 番目は何も返されませんでした。mishik が指摘したようにTRUNC、値SYSDATEtmp.d値を指定すると一致します。


このTO_TIMESTAMP関数は、ここで値を検証するために使用するものではありません。日付の時間コンポーネントは無視されます。このクエリ...

SELECT TO_TIMESTAMP(TO_DATE('7/1/2013 12:34:56', 'MM/DD/YYYY HH24:MI:SS'))
FROM DUAL;

... 2013 年 7 月 2 日のみの日付を返します。時刻コンポーネントは含まれません。

実際に挿入されたものを確認するには、次のようにして、各値の時間コンポーネントを確認します。

SELECT TO_CHAR(d, 'MM/DD/YYYY HH24:MI:SS') FROM tmp;
于 2013-07-01T15:09:18.420 に答える
3

比較するときは、次のtrunc(sysdate)ことも行う必要がありtrunc dます。

select * from tmp where trunc(d) = trunc(sysdate);

d=sysdate挿入後にsysdateが変更されたため、Simpleは機能しません。

于 2013-07-01T14:57:38.890 に答える