У вас есть несколько возможностей. Я предпочитаю иметь типы данных, которые лучше всего подходят для работы. Расчет по времени лучше всего выполнять с использованием 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.
Надеюсь, это поможет.
С уважением,
Роб.