2011-08-17 70 views
1

我有一個關於oracle上的日期函數的問題。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返回12-aug-2011和sysdate-1返回16-aug-2011

任何幫助將不勝感激!

乾杯,

回答

3

Oracle中的日期是精確到秒的時間點。

SYSDATE返回當前的日期和時間,因此不一樣to_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 
+0

如果我想使用SYSDATE,我該如何讓他們返回相同的行數?我應該投它嗎?如果是這樣,怎麼樣? – gumpi

+0

@gumpi:你可以在'sysdate'上使用'trunc'函數 –

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 
5

SYSDATE - 5將給你一個與當前時間的約會。而第二個查詢

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') 

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 
1

所以,如果我在下午1點運行了它精確的查詢將等同於一個Oracle DATE總是有一天和一個時間組件。

sysdate-5恰好在5天前返回一個日期。例如,如果今天是8月17日上午10點,例如sysdate-5將於8月12日上午10點返回。

to_date('12-AUG-2011', 'DD-MON-YYYY')另一方面在8月12日午夜返回。因此它返回的日期比sysdate-5早10個小時。

0

sysdate自動返回一個時間組件,如前面的答案所述。

使用to_date時,它將字符串轉換爲日期。據說這可以傳遞參數來使它返回相同的結果。

看看這個鏈接,解釋它。

to_date parameters