Как отобразить все столбцы типа DATE, когда один столбец на самом деле является датой, а другие просто временем?

Я изучаю SQL и использую Oracle SQL Developer. У меня есть таблица, содержащая следующие столбцы

  1. Дата рейса
  2. Время отправления
  3. Время прибытия

Я вставил значения, используя либо

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.

Oracle не имеет типа данных времени, поэтому вы можете использовать любую дату (которая на самом деле является датой и временем) как для отправления, так и для прибытия (что очень ясно), или использовать интервал между днями и секундами для времени (что позволяет выполнять арифметические операции без дополнительных преобразований типов). )

astentx 24.11.2022 21:57
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
65
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Один из вариантов — изменить 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?

Vonec 24.11.2022 21:54

Вы можете вставить фактическое значение даты; но - если вы хотели полностью избавиться от него, то ответ - нет, потому что в Oracle нет типа данных TIME, а DATE всегда содержит как дату, так и часть времени (до секунд). Если вам нужна более высокая точность, используйте тип данных TIMESTAMP, который также позволяет вводить доли секунды (конечно, вместе с датой).

Littlefoot 24.11.2022 21:58
Ответ принят как подходящий

В Oracle DATE — это двоичный тип данных, состоящий из 7 байтов, представляющих столетие, год века, месяц, день, час, минуту и ​​секунду. В нем ВСЕГДА есть все эти компоненты, и он НИКОГДА не хранится в каком-либо конкретном (удобочитаемом) формате.

Поэтому, если у вас есть DATE, это всегда будет и дата, и время.


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

Если вы хотите сохранить время без даты, вы можете:

  1. Используйте тип данных DATE и просто установите компонент времени (и игнорируйте значения по умолчанию для компонента даты); или
  2. Используйте тип данных 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 25.11.2022 11:56

@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); или больше вариантов в этой скрипке

MT0 25.11.2022 13:40

Вопрос «Когда я делаю 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 
        )

Выбор всего из таблицы выглядит примерно так:

FLIGHT_OPERATOR FLIGHT_FROM FLIGHT_TO ВЫЕЗД ПРИБЫТИЕ SOME_OTHER_COL Vueling Барселона Париж 01-НОЯБРЯ-22 01-НОЯБРЯ-22 Некоторые другие вещи РайанЭйр Барселона Дублин 01-НОЯБРЯ-22 01-НОЯБРЯ-22 Некоторые другие вещи КЛМ Барселона Амстердам 01-НОЯБРЯ-22 01-НОЯБРЯ-22 Некоторые другие вещи Люфтганза Барселона Франкфурт 01-НОЯБРЯ-22 02 НОЯ 22 Некоторые другие вещи

Поскольку вопрос был "Как отобразить дату в первом столбце и время в двух других столбцах?" Я бы сказал, что вы ищете это:

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

Результат будет:

FLIGHT_OPERATOR FLIGHT_FROM FLIGHT_TO ВЫЕЗД ВРЕМЯ ОТПРАВЛЕНИЯ ПРИБЫТИЕ ВРЕМЯ ПРИБЫТИЯ SOME_OTHER_COL Vueling Барселона Париж 01-НОЯБРЯ-22 10:45 01-НОЯБРЯ-22 12:30 Некоторые другие вещи РайанЭйр Барселона Дублин 01-НОЯБРЯ-22 11:10 01-НОЯБРЯ-22 13:00 Некоторые другие вещи КЛМ Барселона Амстердам 01-НОЯБРЯ-22 20:10 01-НОЯБРЯ-22 23:00 Некоторые другие вещи Люфтганза Барселона Франкфурт 01-НОЯБРЯ-22 23:25 02 НОЯ 22 02:20 Некоторые другие вещи

Итак, столбцы «Отправление» и «Прибытие» содержат как дату, так и время. Вы можете выбрать любую часть этой структуры DateTime, которую хотите. В этом ответе я не принимал участие ни в отправлении, ни в прибытии, а в столбцах в целом. Их формат отображения определяется NLS_DATE_FORMAT (вы можете отформатировать его, используя NLS или какой-либо другой способ отображения даты/времени). Я просто выделил части времени для дат вылета и прибытия в отдельные столбцы (как в вопросе), так как могут быть некоторые ночные рейсы с разными датами вылета и прибытия.
С уважением...

Другие вопросы по теме