хранить только время в формате HH24: MM в таблице? Является ли это возможным? - PullRequest
4 голосов
/ 09 декабря 2011

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

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

Вопросы

Может быть, я подхожу к этому неправильно, так как думаю, что вы можете сохранить время с датой в этом одном поле?

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

А как насчет использования VARCHAR2, потому что я собираюсь напечатать его любым способом после заполнения таблицы?

Ответы [ 5 ]

3 голосов
/ 09 декабря 2011

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

Если вы используете 11g, вы можете предварительно отформатировать его с использованием виртуальных столбцов, например:

create table t1
   ( flight_date date,
     flight_time as (to_char(flight_date,'HH24:SS:MI')),
     flight_day as (to_char(flight_date,'dd/mm/yyyy'))
   ); 

, хотя форматирование, вероятно, следует выполнять вваш код UI.

1 голос
/ 09 декабря 2011

Существует ИНТЕРВАЛЬНЫЙ ДЕНЬ ВТОРОГО , который с проверочным ограничением для приема только значений с 0 секундами может подойти для ваших нужд:

SQL> create table flight (
  2     time interval day(0) to second (0),
  3     constraint chk_time
  4     check(
  5             extract(second from time) = 0
  6         )
  7  )
  8  /

Table created
SQL> insert into flight(time)
  2  values (interval '10:30' hour to minute)
  3  /

1 row inserted
SQL> insert into flight(time)
  2  values (interval '10:30:30' hour to second)
  3  /

insert into flight(time)
values (interval '10:30:30' hour to second)

ORA-02290: check constraint (ESTCEDAR.CHK_TIME) violated
SQL> insert into flight(time)
  2  values (interval '23:30' hour to minute)
  3  /

1 row inserted
SQL> insert into flight(time)
  2  values (interval '24:30' hour to minute)
  3  /

insert into flight(time)
values (interval '24:30' hour to minute)

ORA-01873: the leading precision of the interval is too small
SQL> insert into flight(time)
  2  values (interval '1 10:30:30' day to second)
  3  /

insert into flight(time)
values (interval '1 10:30:30' day to second)

ORA-01873: the leading precision of the interval is too small
SQL> select *
  2  from flight
  3  /

TIME
-------------------
+0 10:30:00
+0 23:30:00

SQL> 
1 голос
/ 09 декабря 2011

Oracle не имеет понятия типа данных времени суток.Там DATE, который включает в себя как дату, так и время суток.Есть TIMESTAMP, который включает доли секунды.

Расчет даты и времени в Oracle выполняется с использованием единиц одного дня.Итак, SYSDATE+1 это завтрашнее время.SYSDATE+0.25 через 6 часов.Если вы когда-нибудь захотите использовать это время, которое вы храните, для определения значения типа DATE, вы должны сохранить его как NUMBER.Если все, что вам нужно - это сохранить строку, которая выглядит как время, вы можете использовать VARCHAR2, но вы также сможете хранить бессмысленные значения, такие как 66: 74.

0 голосов
/ 09 декабря 2011

Лично я бы выбрал пользовательский Тип объекта , но это потому, что меня воспитали в ОО. Это даст вам массу преимуществ, если вы подойдете к нему хорошо.

0 голосов
/ 09 декабря 2011

Понятие времени Oracle в течение дня является дробной частью дня.

Соответственно, вы можете хранить время как число с плавающей запятой от нуля до единицы или как целое число минут между 0и 1439, например.

В первом случае вы можете отобразить это так:

TO_CHAR (TRUNC (SYSDATE) + FRACTIME, 'HH24: MI: SS')

Во втором случае вы можете отобразить его так:

TO_CHAR (TRUNC (SYSDATE) + (MINUTES / 1440), 'HH24: MI: SS')

...