Oracle SQL: неверный вывод года при использовании to_date - PullRequest
0 голосов
/ 24 июня 2019

Я пишу Oracle SQL Statement для отчета. Пользователь может ввести даты ОТ / ДО, и я сравниваю его с выданными строками с (просто):

… where changedate < to_date(user_input, 'dd.MM.YYYY')…

Поле "изменено" - это тип данных ДАТА в этой таблице.

Код:

select to_date(changedate, 'dd.MM.YYYY') from TICKETSTATUS;

Поле обычно содержит

30.03.2019 21:50:48

но мой вывод с преобразованием этого кода:

30.03.0019

Почему он это делает? Я хочу «2019» в качестве года, но кажется, что первые 2 числа удалены? Может кто-нибудь объяснить и помочь мне решить эту проблему? Спасибо!

Ответы [ 2 ]

2 голосов
/ 24 июня 2019

[TL; DR]

  1. Не используйте TO_DATE для типа данных DATE.
  2. Возможно, проблема связана с вводом данных.а не на выходе, так как вы, вероятно, получаете двухзначные вводы года, когда ожидается четырехзначный год.

Вам не нужно преобразовывать change_date в DATE, используяTO_DATE, поскольку это уже тип данных DATE.Просто используйте:

select changedate
from   TICKETSTATUS;

Если вы хотите, чтобы значения даты имели определенный формат, используйте TO_CHAR (не TO_DATE):

SELECT TO_CHAR( changedate, 'dd.mm.yyyy' )
FROM   TICKETSTATUS;

, но мой вывод[]:

30.03.0019

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

CREATE TABLE TicketStatus ( changedate DATE );

INSERT INTO TicketStatus ( changedate ) VALUES ( TO_DATE( '30.03.19', 'dd.mm.yyyy' ) );

Тогда год будет 0019.

Однако, если вы используете модель формата RR для лет (или, в зависимости от целесообразности, формат YYмодель):

INSERT INTO TicketStatus ( changedate ) VALUES ( TO_DATE( '30.03.19', 'dd.mm.rr' ) );

Тогда год будет 2019.

SELECT TO_CHAR( changedate, 'dd.mm.yyyy' )
FROM   TicketStatus

Выходы:

| TO_CHAR(CHANGEDATE,'DD.MM.YYYY') |
| :------------------------------- |
| 30.03.0019                       |
| 30.03.2019                       |

db <> Fiddle здесь

Это также может быть связано с тем, что NLS_DATE_SETTING в вашем сеансе установлено на dd.mm.yy и неявное преобразование, выполненное с использованием TO_DATE в столбце даты, удаляет столетие, нотогда ALL у ваших дат будет век 00 (а не только некоторые даты).

2 голосов
/ 24 июня 2019

Попробуйте вставить два типа форматирования rrrr и yyyy для значения года, чтобы увидеть разницу:

create table ticketstatus( id int, changedate date );
insert into ticketstatus values(1,to_date('30.03.19','dd.mm.yyyy'));
insert into ticketstatus values(2,to_date('31.03.19','dd.mm.rrrr'));

select changedate
  from ticketstatus;

CHANGEDATE
------------ 
30.03.0019   
31.03.2019

Действительно, вы можете наблюдать эту универсальную ситуацию, как показано ниже:

with ticketstatus(changedate) as
(
 select '30.03.19' from dual
)
select to_date(changedate,'dd.mm.yyyy') date_with_yy,
       to_date(changedate,'dd.mm.rrrr') date_with_rr
  from ticketstatus;

DATE_WITH_YY    DATE_WITH_RR
------------    ------------
30.03.0019      30.03.2019

Это известно как Year 2k problem, и формат года rrrr вытекает из этой проблемы.Таким образом, формат даты с rrrr может быть использован для таких проблем.

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