Oracle приведение (отметка времени как дата) - PullRequest
2 голосов
/ 11 ноября 2009

Я вижу несоответствие в Oracle. Несоответствие между способом работы значения INSERT timestamp data_type в столбце DATE data_type и способом CAST (timestamp as DATE).

INSERT, кажется, просто обрезает миллисекунды от значения временной метки, в то время как CAST округляет их до ближайшей секунды.

Пример:

  1. TEMP TABLE

    create table test_timestamp_to_date 
    (date_col date, timestamp_col timestamp(6));
    
  2. Вставки:

    insert into test_timestamp_to_date select 
    to_timestamp('11-OCT-2009 2:23:23.793915 PM'),
    to_timestamp('11-OCT-2009 2:23:23.793915 PM')
    from dual;
    
    insert into test_timestamp_to_date select 
    cast(to_timestamp('11-OCT-2009 2:23:23.793915 PM') as date),
    to_timestamp('11-OCT-2009 2:23:23.793915 PM')
    from dual;
    
  3. РЕЗУЛЬТАТЫ:

    1* select to_char(date_col,'DD-MON-YYYY HH24:MI:SS') date_col, timestamp_col
         from test_timestamp_to_date
    SQL> /
    
    DATE_COL             TIMESTAMP_COL
    -------------------- ----------------------------
    11-OCT-2009 14:23:23 11-OCT-09 02.23.23.793915 PM
    11-OCT-2009 14:23:24 11-OCT-09 02.23.23.793915 PM
    

Вопрос

Есть ли какой-нибудь простой способ избежать округления миллисекунд при использовании CAST? И я не говорю об использовании комбинации TO_CHAR, TO_DATE с определенным форматированием; есть ли еще что-нибудь? Кодирование с помощью CAST уже выполнено, но мне нужно действительно простое исправление.

Ответы [ 2 ]

4 голосов
/ 12 ноября 2009

Для тех, кто заинтересован. Я только что понял.

В функции ORACLE CAST имеется ошибка, из-за которой она работает по-разному при использовании CAST в SQL по сравнению с использованием CAST в PL / SQL.

Функция CAST ошибочно округляет дробные части в SQL и корректно обрезает их в PL / SQL.

Как мы видим, PL / SQL ведет себя так же, как и преобразование «по умолчанию» (вставка в метку времени выбора даты), означающее, что преобразование «по умолчанию» также работает правильно.

Ошибка исправлена ​​в 11gR2, и есть исправление для 10g.

CAST SQL должен (и будет после патча) ОБРАЩАТЬСЯ к дробным дробям вместо их округления.

Спасибо.

2 голосов
/ 11 ноября 2009

Есть ли какой-нибудь простой способ избежать округления миллисекунд при использовании CAST?

Нет, тип данных DATE не имеет дробных секунд . В этом типе данных нет средств для удовлетворения того, что вы просите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...