Создание таблицы со столбцом даты, содержащим только определенные столбцы

#sql #oracle #date

#sql #Oracle #Дата

Вопрос:

Я должен создать эту таблицу :

 Temps_ED (DateFacture, month, year)
 

где :

 DateFacture :day month year
month: (month year)
year : year
 

Комментарии:

1. Каким типом данных должны быть эти столбцы?? И какую СУБД вы используете?

2. дата, которую я предполагаю? это не указано, но я думаю, что date, было бы легко просто сделать их varchar . и я использую Oracle 21C

3. было бы легко просто сделать их переменными, и это привело бы к тому, что в будущем вы стали бы задавать дополнительные вопросы о том, как справляться с проблемами, вызванными датами, хранящимися в виде строк.

4. я думаю, что смогу справиться с этим или, по крайней мере, найти для этого решения, для этого я искал и не нашел ничего полезного, или, может быть, решение, которое я представляю, вообще не существует

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

Ответ №1:

Oracle имеет два типа данных для хранения значений даты и времени.

  • DATE
  • TIMESTAMP

У обоих всегда есть компоненты год, месяц, день, час, минута, секунда. TIMESTAMP может, необязательно, иметь доли секунды и / или временную метку. Следовательно, у вас должен быть компонент времени, если вы используете DATE TIMESTAMP тип данных или.

я спрашиваю, есть ли способ указать дату типа столбца, но только в определенном формате, например, в «дата месяца ‘мм / дд'»

Нет, оба DATE и TIMESTAMP являются двоичными типами данных; они не хранят никакого формата. Если вам нужен формат, вам нужно преобразовать его из двоичных данных в форматированные данные (т. Е. Строку), но это не означает, что вы должны хранить свои значения в виде строк; вы должны хранить их как двоичные данные, а затем форматировать их при извлечении / отображении.


Одним из решений является сохранение a DATE , а затем использование виртуальных столбцов для получения других форматов; это гарантирует согласованность всех столбцов.

 CREATE TABLE temps_ed (
  value        DATE,
  datefracture VARCHAR2(10)
               GENERATED ALWAYS AS (TO_CHAR(value, 'YYYY-MM-DD')),
  month        VARCHAR2(7)
               GENERATED ALWAYS AS (TO_CHAR(value, 'YYYY-MM')),
  year         NUMBER(4,0)
               GENERATED ALWAYS AS (EXTRACT(YEAR FROM value))
);

INSERT INTO temps_ed (value) VALUES (SYSDATE);
 

Затем:

 SELECT * FROM temps_ed;
 

Выводит:

ЗНАЧЕНИЕ DATEFRACTURE МЕСЯЦ ГОД
2021-12-04T14:41:37 2021-12-04 2021-12 2021

db<>скрипка здесь

Комментарии:

1. вау, это сработает!! большое спасибо, сэр!

2. «вау, это сработает!! большое спасибо, сэр! » Здесь есть более важный урок. Никогда не зацикливайтесь на каком-то заранее продуманном решении. И чем меньше вы знаете о данной технологии, тем важнее этот урок.

3. ммм, уверен, что иг? спасибо за мудрость?