#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. ммм, уверен, что иг? спасибо за мудрость?