我有一个关于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日
任何帮助都将不胜感激!
干杯,
发布于 2011-08-17 21:52:32
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如果只需要date组件,请使用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-17 21:52:47
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-17 21:52:23
因为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')要避免time组件,请执行以下操作:
SELECT COUNT(*) FROM statistic_table
WHERE date_created BETWEEN TRUNC(sysdate)-5 AND TRUNC(sysdate)-1https://stackoverflow.com/questions/7093915
复制相似问题