1

Oracleの日付関数について質問があります。

私は次の表を持っています

statistic_table(
   pages AS varchar(10),
   date_created AS date
);

私は次のSQLを持っています

SELECT COUNT(*) FROM statistic_table WHERE date_created BETWEEN sysdate-5 AND sysdate-1
and
SELECT COUNT(*) FROM statistic_table WHERE date_created BETWEEN to_date('12-AUG-2011') AND to_date('16-AUG-2011');

問題は、なぜそれが異なる数を返すのかということです。sysdate-5が2011年8月12日を返し、sysdate-1が2011年8月16日を返すと仮定します。

どんな助けでも大歓迎です!

乾杯、

4

5 に答える 5

5

sysdate-5は、現在の時刻の日付を提供します。したがって、午後1時に正確に実行した場合、クエリは次のようになります。

select (*) 
FROM statistic_table 
WHERE date_created BETWEEN to_date('12-Aug-2011 13:00:00') 
                       AND to_date('16-Aug-2011 13:00:00')

一方、2番目のクエリは次のとおりです。

select (*) 
FROM statistic_table 
WHERE date_created BETWEEN to_date('12-Aug-2011 00:00:00') 
                       AND to_date('16-Aug-2011 00:00:00')

代わりにこれを試してみてください:

select (*) 
FROM statistic_table 
WHERE date_created BETWEEN trunc(sysdate) -5 
                       AND trunc(sysdate) -1
于 2011-08-17T13:52:46.727 に答える
3

Oracleの日付は、1秒の精度の時点です。

SYSDATEto_date('17-AUG-2011')現在の日付と時刻を返すため、 :と同じではありません。

SQL> SELECT to_char(sysdate, 'dd-mon-yyyy hh24:mi:ss') FROM DUAL;

TO_CHAR(SYSDATE,'DD-MON-YYYYHH
------------------------------
17-aug-2011 15:52:13

TRUNC日付コンポーネントのみが必要な場合は、この関数を使用します。

SQL> SELECT to_char(trunc(sysdate), 'dd-mon-yyyy hh24:mi:ss') FROM DUAL;

TO_CHAR(TRUNC(SYSDATE),'DD-MON
------------------------------
17-aou-2011 00:00:00
于 2011-08-17T13:52:31.513 に答える
2

SYSDATEには時間コンポーネントが含まれているため、現在の時刻が11:22:33の場合、

SELECT COUNT(*) FROM statistic_table 
WHERE date_created BETWEEN sysdate-5 AND sysdate-1

実際にはと同等です

SELECT COUNT(*) FROM statistic_table
WHERE date_created BETWEEN to_date('12-AUG-2011 11:22:33','DD-MON-YYYY HH24:MI:SS')
                       AND to_date('16-AUG-2011 11:22:33','DD-MON-YYYY HH24:MI:SS')

時間コンポーネントを回避するには、次のようにします。

SELECT COUNT(*) FROM statistic_table 
WHERE date_created BETWEEN TRUNC(sysdate)-5 AND TRUNC(sysdate)-1
于 2011-08-17T13:52:22.797 に答える
1

OracleDATEには、常に日と時間のコンポーネントがあります。

sysdate-5ちょうど5日前の日付を返します。たとえば、今日が8月17日の午前10時である場合、sysdate-58月12日の午前10時に戻ります。

to_date('12-AUG-2011', 'DD-MON-YYYY')一方、8月12日深夜に戻ります。したがって、。より10時間早い日付を返しますsysdate-5

于 2011-08-17T13:53:48.303 に答える
0

sysdateは、前の回答で述べたように、時間コンポーネントで自動戻ります。

to_dateを使用すると、文字列を日付に変換します。そうは言っても、パラメータを渡して同じものを返すようにすることができます。

それを説明するこのリンクを見てください。

to_dateパラメータ

于 2011-08-17T13:56:59.737 に答える