2010-12-02 6 views
1

У меня есть следующая странная проблема в OracleПроблема формата даты 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-декабря-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

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

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

Заранее за вашу помощь.

ответ

5

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

UPDATE favorite_item 
SET favorite_item.last_used_date = sysdate 
WHERE favorite_item.favorite_item_id = 1` 
+0

Я действительно осознал это в своем доме прошлой ночью. Думаю, это был мой мозг конца дня :) –

+0

Никогда не говорил об этом. Спасибо, кстати :) –

1

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

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

Ваш оператор SELECT не генерирует ошибку или полностью неверный результат тогда и только тогда, когда NLS_DATE_FORMAT текущего сеанса оказывается DD-MON-YY (который даже не является стандартным DD-MON-RR - это вернет год 2 по умолчанию, установленный по-английски по-английски). Но так как NLS_DATE_FORMAT зависит от клиентских и региональных настроек клиента, это плохая идея, когда-либо полагаться на какую-либо конкретную настройку NLS_DATE_FORMAT. –

4

Проблема с использованием функции 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 
Смежные вопросы