Запоминание времени в Oracle - PullRequest
0 голосов
/ 17 декабря 2010

Позвольте мне быстро объяснить.У меня есть приложение для управления посетителями.

У нас есть начальная дата посещения (посещение может быть только на один день).Мы можем добавить время, например, время тура, время, когда группа будет обедать, время, когда группа будет проводить презентацию и т. Д. Во все времена будет приниматься дата начала посещения, а затем добавляться время соответственно.

Простой код:

   // set tour time in tour table
    $y->setTourTime($visit->getVisitDate("Y-m-d") . $tourTime);
    // can have many presentation
    $p->setPresentationTime($visit->getVisitDate("Y-m-d") . $tourTime);

Итак, у меня много отметок времени в нескольких таблицах.Однако у меня возникла проблема: если я решу изменить дату начала в объекте посещения, мне придется изменить все временных меток в соответствующих таблицах (гид, лекции и т. Д.). Это некрасиво

Я бы предпочел, чтобы в таблице посещений была дата посещения, например 2010-10-10.А затем в лекционных таблицах, таблицах руководств и т. Д. Просто хранить время, а не дату.Как бы Вы это сделали?просто сохраните его как строку, то есть "10:00"?

Спасибо за любой вклад.: -)

Ответы [ 2 ]

6 голосов
/ 17 декабря 2010

У вас есть несколько возможностей. Я предпочитаю иметь типы данных, которые лучше всего подходят для работы. Расчет по времени лучше всего выполнять с использованием DATE, TIMESTAMP и INTERVAL, поэтому я бы использовал что-то вроде этого:

SQL> create table visits
  2  ( startdate              date
  3  , starttime_tour         interval day(0) to second(0)
  4  , starttime_lunch        interval day(0) to second(0)
  5  , starttime_presentation interval day(0) to second(0)
  6  , constraint visits_ck1 check (startdate = trunc(startdate))
  7  )
  8  /

Table created.

Подробнее о типе ИНТЕРВАЛ ДЕНЬ ВТОРОМУ вы можете прочитать здесь: http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/sql_elements001.htm#SQLRF00207

А вот пример того, как вы вставляете и выбираете из него:

SQL> insert into visits
  2  values
  3  ( trunc(sysdate)
  4  , to_dsinterval('0 09:00:00')
  5  , to_dsinterval('0 12:00:00')
  6  , to_dsinterval('0 13:00:00')
  7  )
  8  /

1 row created.

SQL> select startdate
  2       , starttime_tour
  3       , starttime_lunch
  4       , starttime_presentation
  5    from visits
  6  /

STARTDATE           STARTTIME_TOUR       STARTTIME_LUNCH      STARTTIME_PRESENTATI
------------------- -------------------- -------------------- --------------------
17-12-2010 00:00:00 +0 09:00:00          +0 12:00:00          +0 13:00:00

1 row selected.

И вычисление теперь очень просто:

SQL> select startdate
  2       , startdate + starttime_tour as tour
  3       , startdate + starttime_lunch as lunch
  4       , startdate + starttime_presentation as presentation
  5    from visits
  6  /

STARTDATE           TOUR                LUNCH               PRESENTATION
------------------- ------------------- ------------------- -------------------
17-12-2010 00:00:00 17-12-2010 09:00:00 17-12-2010 12:00:00 17-12-2010 13:00:00

1 row selected.

Надеюсь, это поможет.

С уважением, Роб.

0 голосов
/ 17 декабря 2010

Если вы хотите манипулировать как временем, может быть лучше просто создать два поля даты. Один содержит дату посещения, другой - время тура с прикрепленной общей датой (1/1/2000 или что-то непротиворечивое и неконкретное) - вы игнорируете часть даты времени тура, но все равно можете делать сравнения на основе времени, если необходимо без преобразования строки в значение времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...