Функция даты на оракуле - PullRequest
       53

Функция даты на оракуле

1 голос
/ 17 августа 2011

У меня есть вопрос о функции даты на 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 августа 2011 года, а sysdate-1 вернется 16 августа 2011 года

Любая помощь будет высоко ценится!

Приветствия

Ответы [ 5 ]

5 голосов
/ 17 августа 2011

sysdate - 5 даст вам дату с текущим временем. Поэтому, если бы я запустил его точно в 13:00, запрос был бы эквивалентен:

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
3 голосов
/ 17 августа 2011

Дата в 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
2 голосов
/ 17 августа 2011

Поскольку 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
1 голос
/ 17 августа 2011

Oracle DATE всегда имеет компонент дня и времени.

sysdate-5 возвращает дату ровно 5 дней назад.Например, если сегодня 17 августа в 10 часов утра, sysdate-5 возвращает 12 августа в 10 часов утра.

to_date('12-AUG-2011', 'DD-MON-YYYY'), с другой стороны, возвращает 12 августа в полночь.Таким образом, он возвращает дату, которая на 10 часов раньше, чем sysdate-5.

0 голосов
/ 17 августа 2011

sysdate автоматически возвращается с компонентом времени, упомянутым в предыдущих ответах.

При использовании to_date конвертирует строку в дату. С учетом вышесказанного вы можете передать параметры, чтобы он возвращал то же самое.

Посмотрите на эту ссылку, которая объясняет это.

to_date параметры

...