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 返回 12-aug-2011 并且 sysdate-1 返回 16-aug-2011

任何帮助将非常感激!

干杯,

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

而第二个查询是:

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 中的日期是精确到秒的时间点。

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
于 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-5返回 8 月 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 回答