Я изучаю SQL и использую Oracle SQL Developer. У меня есть таблица, содержащая следующие столбцы
Я вставил значения, используя либо
TO_DATE('10:45', 'hh24:mi')
или
TO_DATE('20/10/2000', 'DD/MM/YYYY')
Когда я делаю SELECT * FROM TABLE_NAME, время отправления и время прибытия отображают дату (которую я не ввел). Как отобразить дату в первом столбце и время в двух других столбцах?
я пытался `
SELECT to_char(DepartureTime, 'HH24:MI' ) AS Departure
to_char( ArrivalTime, 'HH24:MI' ) AS Arrival
FROM FLIGHT;
` Хотя приведенный выше оператор отображает правильные значения, я хочу написать оператор для вывода всех столбцов (поскольку фактическая таблица имеет более 3 столбцов), но в формате, объясненном выше, — дату для FlightDate и время для DepartureTime и ArrivalTime.
Один из вариантов — изменить NLS сеанса и одновременно повлиять на все столбцы типа данных DATE
. Вот как:
Пример таблицы и некоторые данные:
SQL> create table flight
2 (id number,
3 flight_date date,
4 departure_time date,
5 arrival_time date);
Table created.
SQL> insert into flight values (1, to_date('10:45', 'hh24:mi'), to_date('20/10/2000', 'dd/mm/yyyy'), sysdate);
1 row created.
Вот что возвращает моя база данных в результате:
SQL> select * From flight;
ID FLIGHT_DA DEPARTURE ARRIVAL_T
---------- --------- --------- ---------
1 01-NOV-22 20-OCT-00 24-NOV-22
Теперь измените формат на что-то другое:
SQL> alter session set nls_date_Format = 'dd.mm.yyyy hh24:Mi';
Session altered.
Результат:
SQL> select * From flight;
ID FLIGHT_DATE DEPARTURE_TIME ARRIVAL_TIME
---------- ---------------- ---------------- ----------------
1 01.11.2022 10:45 20.10.2000 00:00 24.11.2022 21:17
SQL>
Это пример SQL*Plus, но то же самое работает и в SQL Developer.
Либо откройте настройки SQL Developer (в меню «Инструменты»), найдите «NLS» и введите нужный формат даты.
Итак, Oracle по умолчанию вставляет первый день текущего месяца в Flight_Date? Есть ли способ избавиться от «01.11.2022» из Flight_Date?
Вы можете вставить фактическое значение даты; но - если вы хотели полностью избавиться от него, то ответ - нет, потому что в Oracle нет типа данных TIME, а DATE всегда содержит как дату, так и часть времени (до секунд). Если вам нужна более высокая точность, используйте тип данных TIMESTAMP, который также позволяет вводить доли секунды (конечно, вместе с датой).
В Oracle DATE
— это двоичный тип данных, состоящий из 7 байтов, представляющих столетие, год века, месяц, день, час, минуту и секунду. В нем ВСЕГДА есть все эти компоненты, и он НИКОГДА не хранится в каком-либо конкретном (удобочитаемом) формате.
Поэтому, если у вас есть DATE
, это всегда будет и дата, и время.
Если вы хотите сохранить только компонент даты даты, вам нужно будет использовать всю дату, но вы можете добавить ограничение, чтобы время всегда было в полночь.
Если вы хотите сохранить время без даты, вы можете:
DATE
и просто установите компонент времени (и игнорируйте значения по умолчанию для компонента даты); илиINTERVAL DAY TO SECOND
.Например, ваша таблица может быть:
CREATE TABLE table_name (
FlightDate DATE
CONSTRAINT table_name__flightdate__chk CHECK (flightdate = TRUNC(flightdate)),
DepartureTime INTERVAL DAY(0) TO SECOND(0) NOT NULL,
ArrivalTime INTERVAL DAY(1) TO SECOND(0) NOT NULL
);
Или вы можете упростить свою таблицу до:
CREATE TABLE table_name (
Departure DATE NOT NULL,
Arrival DATE NOT NULL
);
и не беспокойтесь о разных датах и времени.
Не могли бы вы предоставить оператор для вставки, например, 10:45 при использовании INTERVAL DAY TO SECOND
без длинной точности?
@Vonec INSERT INTO table_name (flightDate, DepartureTime, ArrivalTime) VALUES (DATE '2022-11-25', INTERVAL '12:34' HOUR TO MINUTE, INTERVAL '1 02:15' DAY TO MINUTE);
или больше вариантов в этой скрипке
Вопрос «Когда я делаю SELECT * FROM TABLE_NAME, время отправления и время прибытия отображают дату (которую я не ввел). Как мне отобразить дату в первом столбце и время в двух других столбцах?» насколько я понимаю, сообщает, что столбцы DepartureTime и ArrivalTime заполняются датой и временем (как это обычно бывает). Я предполагаю, что ваши данные выглядят примерно так:
WITH
flights (FLIGHT_OPERATOR, FLIGHT_FROM, FLIGHT_TO, DEPARTURE, ARRIVAL, SOME_OTHER_COL) AS
(
Select 'Vueling', 'Barcelona', 'Paris', To_Date('01.11.2022 10:45', 'dd.mm.yyyy hh24:mi'), To_Date('01.11.2022 12:30', 'dd.mm.yyyy hh24:mi'), 'Some other stuff' From Dual Union All
Select 'RyanAir', 'Barcelona', 'Dublin', To_Date('01.11.2022 11:10', 'dd.mm.yyyy hh24:mi'), To_Date('01.11.2022 13:00', 'dd.mm.yyyy hh24:mi'), 'Some other stuff' From Dual Union All
Select 'KLM', 'Barcelona', 'Amsterdam', To_Date('01.11.2022 20:10', 'dd.mm.yyyy hh24:mi'), To_Date('01.11.2022 23:00', 'dd.mm.yyyy hh24:mi'), 'Some other stuff' From Dual Union All
Select 'Lufthansa', 'Barcelona', 'Frankfurt', To_Date('01.11.2022 23:25', 'dd.mm.yyyy hh24:mi'), To_Date('02.11.2022 02:20', 'dd.mm.yyyy hh24:mi'), 'Some other stuff' From Dual
)
Выбор всего из таблицы выглядит примерно так:
Поскольку вопрос был "Как отобразить дату в первом столбце и время в двух других столбцах?" Я бы сказал, что вы ищете это:
Select
FLIGHT_OPERATOR, FLIGHT_FROM, FLIGHT_TO,
DEPARTURE, To_Char(DEPARTURE, 'hh24:mi') "DEPARTURE_TIME",
ARRIVAL, To_Char(ARRIVAL, 'hh24:mi') "ARRIVAL_TIME",
SOME_OTHER_COL
From
flights
Order By
DEPARTURE, FLIGHT_OPERATOR
Результат будет:
Итак, столбцы «Отправление» и «Прибытие» содержат как дату, так и время. Вы можете выбрать любую часть этой структуры DateTime, которую хотите. В этом ответе я не принимал участие ни в отправлении, ни в прибытии, а в столбцах в целом. Их формат отображения определяется NLS_DATE_FORMAT (вы можете отформатировать его, используя NLS или какой-либо другой способ отображения даты/времени). Я просто выделил части времени для дат вылета и прибытия в отдельные столбцы (как в вопросе), так как могут быть некоторые ночные рейсы с разными датами вылета и прибытия.
С уважением...
Oracle не имеет типа данных времени, поэтому вы можете использовать любую дату (которая на самом деле является датой и временем) как для отправления, так и для прибытия (что очень ясно), или использовать интервал между днями и секундами для времени (что позволяет выполнять арифметические операции без дополнительных преобразований типов). )