Проблема формата даты в Oracle - PullRequest
1 голос
/ 02 декабря 2010

У меня есть следующая странная проблема в Oracle

(имейте в виду, что у меня мало опыта в SQL и даже меньше в Oracle).

Если я сделаю это:

SELECT TO_CHAR(sysdate, 'YYYY-MM-DD HH24:MI') FROM dual

Я получаю это: 2010-12-02 18: 39

Все в порядке.

Однако, если я сделаю это:

UPDATE favorite_item
SET favorite_item.last_used_date = TO_DATE(sysdate, 'YYYY-MM-DD HH24:MI')
WHERE favorite_item.favorite_item_id = 1

Я получаю это в своей базе данных: 10-DEC-02

Что является 10 декабря '02, что неверно

Если я сделаю это, чтобы подтвердить:

SELECT TO_CHAR(favorite_item.last_used_date, 'YYYY-MM-DD HH24:MI') AS last_used_date
    FROM favorite_item
    WHERE favorite_item.favorite_item_id = 1   

Я получаю это: 0002-12-10 00: 00

Что совершенно неправильно.

Что я делаю не так?Я чувствую, что установка даты не работает правильно.

Заранее спасибо за помощь.

Ответы [ 3 ]

5 голосов
/ 02 декабря 2010

Не используйте TO_DATE() на sysdate; sysdate уже дата.

UPDATE favorite_item  
SET favorite_item.last_used_date = sysdate  
WHERE favorite_item.favorite_item_id = 1`
4 голосов
/ 02 декабря 2010

Проблема заключается в использовании функции to_date () для чего-либо, кроме строки.

Что касается того, почему вы получаете неправильные результаты, существует внутреннее преобразование, которое происходит, когда вы используете to_date в дату. Поскольку to_date фактически принимает входные данные в виде строки, ваша дата первоначально конвертируется в строку (в соответствии с настройкой NLS_DATE_FORMAT), а затем преобразуется обратно в дату. Отсюда и несоответствие.

SQL> select sysdate from dual;

SYSDATE
---------
02-DEC-10

SQL> select to_date(sysdate,'YYYY-MM-DD') from dual;

TO_DATE(S
---------
10-DEC-02

--- This is because, the above string is actually executed as

SQL> select to_date(
             to_char('02-DEC-10','YYYY-MM-DD') from dual;

TO_DATE('
---------
10-DEC-02


SQL> select to_date(
  2                  /* implicit conversion... dd-mon-yy' is my session's NLS_DATE_FORMAT */
  3                  to_char(sysdate,'dd-mon-yy'),
  4                 'YYYY-MM-DD')
  5       from dual;

TO_DATE(/
---------
10-DEC-02
1 голос
/ 02 декабря 2010

sysdate возвращает дату, поэтому преобразование ее в дату с использованием to_date (sysdate, ...) является избыточным / необязательным. Вы получаете этот странный результат, потому что дата преобразуется в строку с помощью функции to_date с использованием Oracle по умолчанию «DD-MON-YY», а затем возвращается к дате с использованием предоставленного формата «YYYY-MM-DD» , Поскольку форматы не совпадают, Oracle интерпретирует год как день, а день - как год. Это работает правильно (но, опять же, избыточно):

select to_date(sysdate, 'DD-MON-YY') from dual;
...