2015-10-30 5 views
0

Я видел документацию для функции TIMESTAMPDIFF в Oracle here, но он упоминает, что это для «Oracle9i Lite».TIMESTAMPDIFF в Oracle 11g?

Когда я пытаюсь использовать пример на Oracle 11g:

SELECT TIMESTAMPDIFF(SQL_TSI_DAY, CURRENT_DATE, '1998-12-09') FROM DUAL; 

Я получаю ошибку о неверном идентификатор на TIMESTAMPDIFF. Является ли эта функция недоступной в Oracle 11g? Или это то, что мне нужно настроить для DBA?

+0

У вас есть столбец CURRENT_DATE или вы хотите использовать SYSDATE? – Mihai

+1

@Mihai: 'CURRENT_DATE' действителен в 11g. Он похож на 'SYSDATE', но чувствителен к часовому поясу сеанса. – Allan

+0

Изучение чего-то нового повседневного @Allan – Mihai

ответ

2

Эта функция не существует в Oracle RDMBS; это явно было в Oracle Lite (с которым я никогда не сталкивался), и я считаю, что это в других базах данных, таких как MySQL.

Существует документация, покрывающая datetime and interval arithmetic, которая поможет вам в этом. вы можете либо вычесть одну временную метку из другой; или одна дата от другой, или смесь из двух - но проще придерживаться одного типа данных. В зависимости от которых вы используете вы либо получите интервал или число, представляющее собой количество дней:

SQL> SELECT CURRENT_TIMESTAMP - TIMESTAMP '1998-12-09 00:00:00' FROM DUAL; 

CURRENT_TIMESTAMP-TIMESTAMP'1998-12-0900:00:00' 
--------------------------------------------------------------------------- 
+000006169 16:16:21.287166000 

SQL> SELECT CURRENT_DATE - DATE '1998-12-09' FROM DUAL; 

CURRENT_DATE-DATE'1998-12-09' 
----------------------------- 
        6169.67775 

Если вы просто хотите, количество полных дней вы можете использовать extract() для интервала, чтобы получить только элемент, который вы хотите или trunc() для числа, чтобы удалить дробную часть:

SQL> SELECT EXTRACT(DAY FROM CURRENT_TIMESTAMP - TIMESTAMP '1998-12-09 00:00:00') FROM DUAL; 

EXTRACT(DAYFROMCURRENT_TIMESTAMP-TIMESTAMP'1998-12-0900:00:00') 
--------------------------------------------------------------- 
                  6169 

SQL> SELECT TRUNC(CURRENT_DATE - DATE '1998-12-09') FROM DUAL; 

TRUNC(CURRENT_DATE-DATE'1998-12-09') 
------------------------------------ 
           6169 

вы также можете trunc() текущую дату до сравнения, если вы предпочитаете, так что вы сравниваете как в полночь, а это означает, что не будет дробным дневная часть для удаления:

SQL> SELECT TRUNC(CURRENT_DATE) - DATE '1998-12-09' FROM DUAL; 

TRUNC(CURRENT_DATE)-DATE'1998-12-09' 
------------------------------------ 
           6169 

Я использовал литералы даты ANSI для фиксированной даты, но вы можете использовать существующую дату или временную переменную или столбец; или to_date() или to_timestamp(), если у вас есть строка в другом формате.


Вы также можете использовать extract() для преобразования компонентов интервальных к общей величине, as shown here; а также убедитесь, что вы знаете разницу между current_date and sysdate, and the timestamp equivalents.

1

Я никогда не сталкивался с TIMESTAMPDIFF, но вы можете сделать что-то подобное, просто применяя регулярной математике для ваших значений даты:

SELECT CURRENT_DATE - to_timestamp('1998-12-09','yyyy-mm-dd') FROM DUAL;