Какой тип данных лучше всего подходит для поля формата «ГГГГ-ММ-ДД» в Oracle 11g? - PullRequest
0 голосов
/ 09 мая 2018

Я создаю таблицы в таблице Oracle 11g и наткнулся на одно поле даты в формате «ГГГГ-ММ-ДД».Я не хочу использовать varchar2 для этого, и когда я использую число (5), он все еще принимает ввод.Тогда что означает здесь предел 5?

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

1 Ответ

0 голосов
/ 09 мая 2018

Это, очевидно, маска формата date . Если вы собираетесь сохранять даты в этом столбце, вы должны использовать тип данных DATE, например

SQL> create table test
  2    (datum date);

Table created.

Не используйте для этого типы данных VARCHAR2 (вставляйте строки, а не даты) и NUMBER (вставляйте цифры, а не даты). Вы пожалеете об этом раньше, чем думаете.

Я собираюсь ввести некоторые значения в таблицу, показывая различные способы, как вы могли бы сделать это - важно, чтобы вы вставляли в нее даты, а не строки. Никогда не полагайтесь на Oracle, неявно преобразуя строки, которые вы можете предоставить, в даты. Рано или поздно произойдет ошибка.

SQL> insert into test values (date '2018-12-25');

1 row created.

SQL> insert into test values (to_date('09.05.2018', 'dd.mm.yyyy'));

1 row created.

SQL> insert into test values (sysdate);

1 row created.

Теперь, несколько способов выбора этого значения:

Эта дата возвращает дату в формате, установленном в настоящее время настройками NLS моей базы данных:

SQL> select * from test;

DATUM
--------
25.12.18
09.05.18
09.05.18

Я заставляю его возвращать значения в нужном формате, используя ALTER SESSION:

SQL> alter session set nls_date_format = 'yyyy-mm-dd';

Session altered.

SQL> select * from test;

DATUM
----------
2018-12-25
2018-05-09
2018-05-09

еще один формат; обратите внимание, что значение, вставленное с помощью функции SYSDATE (которая возвращает DATE), содержит компонент даты и Это было «невидимо» в предыдущих примерах:

SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi:ss';

Session altered.

SQL> select * from test;

DATUM
-------------------
25.12.2018 00:00:00
09.05.2018 00:00:00
09.05.2018 08:03:50

Использование функции TO_CHAR с некоторым форматом (например, dd-mon-yyyy). Я также прошу Oracle «перевести» название месяца на английский (поскольку моя база данных работает на хорватском языке):

SQL> select to_char(datum, 'dd-mon-yyyy', 'nls_date_language = english') datum from test;

DATUM
-----------
25-dec-2018
09-may-2018
09-may-2018

SQL>

[EDIT]

Oracle не хранит значения DATE в каком-либо «читаемом» формате (читайте в Интернете больше, Google для этого). Это маска формата, которая представляет это значение для вас.

Я настоятельно предлагаю вам НЕ сохранять даты в любом столбце типа данных, кроме DATE. Это бомба замедленного действия, ожидающая взрыва (а потом будет больно). Никто не мешает вам ввести значение как «1234-99-66» или «12 -345-678»; что ты будешь с этим делать тогда?

Рассмотрите возможность создания представления в верхней части таблицы, которое использует функцию TO_CHAR и возвращает значение в нужном формате ('гггг-мм-дд'). Столбец типа данных DATE в таблице гарантирует, что значения действительны , и представление позволит стороннему приложению принимать значения, которые оно сочтет подходящими.

Например:

SQL> create view v_test as
  2    select to_char(datum, 'yyyy-mm-dd') datum
  3    from test;

View created.

SQL> select * from v_test;

DATUM
----------
2018-12-25
2018-05-09
2018-05-09

SQL>

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

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