2010-12-17 134 views
0

让我快速解释一下。我有一个应用程序来管理访问者。在Oracle中存储时间

我们有一个访问的开始日期(只能访问一天)。 我们可以添加一个时间,例如一次旅行的时间,该小组将进行午餐的时间,该小组将进行演示的时间等。所有时间将会以该访问的开始日期为准,然后相应地添加时间。

简单代码:

// 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”?

感谢您的任何意见。 :-)

回答

6

你有几种可能性。我更喜欢拥有最适合这项工作的数据类型。随着时代的计算最好使用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. 

你可以阅读更多有关INTERVAL DAY TO SECOND数据类型在这里: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. 

希望这有助于。

Regards, Rob。

+0

谢谢抢劫! :D优秀。 :-) – Flukey 2010-12-17 13:57:40

0

如果你想操纵一段时间,最好只创建两个日期字段。一个持有访问日期,另一个持有带有通用日期的巡视时间(1/1/2000或者一致性&非特定) - 您忽略巡视时间的日期部分,但仍可以进行基于时间的比较,如果不需要将字符串转换为时间值。