2010-12-17 12 views
0

Lassen Sie mich schnell erklären. Ich habe eine Anwendung, um Besucher zu verwalten.Speichern der Zeit in Oracle

Wir haben ein Startdatum des Besuchs (ein Besuch kann nur für einen Tag sein). Wir können eine Zeit hinzufügen, zum Beispiel die Zeit einer Tour, die Zeit, zu der die Gruppe zu Mittag essen wird, die Zeit, zu der die Gruppe eine Präsentation hat usw. Alle Zeiten nehmen das Anfangsdatum des Besuchs und dann die Zeit entsprechend an .

Einfach Code:

// 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); 

Also habe ich viele Zeitmarken über mehrere Tabellen haben. Das Problem habe ich jedoch, wenn ich beschließe, das Startdatum in der Besuchseinheit zu ändern, dann muss ich alle der Zeitstempel über die zugehörigen Tabellen (Reiseleiter, Vorträge usw.) ändern Dies ist hässlich

Was ich bevorzugen würde, ist ein Besuchstermin, wie 2010-10-10 in der Besuchstabelle. Und dann in den Vorlesungstischen, Tabellen usw. nur die Uhrzeit und nicht das Datum zu speichern. Wie würdest du das machen? speichern Sie es einfach als Zeichenfolge, d. h. "10:00"?

Danke für jede Eingabe. :-)

Antwort

6

Sie haben mehrere Möglichkeiten. Ich bevorzuge Datentypen, die für den Job am besten geeignet sind. Rechnen mit Zeiten wird am besten unter Verwendung von DATE, TIMESTAMP und INTERVAL getan, so würde ich so etwas wie folgt verwenden:

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. 

Sie können mehr über den INTERVAL DAY TO SECOND Datentyp lesen Sie hier: http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/sql_elements001.htm#SQLRF00207

Und hier ist ein Beispiel, wie man daraus ein und wählen Sie:

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. 

und berechnend ist sehr einfach jetzt:

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. 

Hoffe, das hilft.

Grüße, Rob.

+0

Dank rob! : D Ausgezeichnet. :-) – Flukey

0

Wenn Sie als Zeit manipulieren möchten, ist es möglicherweise besser, nur zwei Datumsfelder zu erstellen. Einer hält das Besuchsdatum, der andere hält die Reisezeit mit einem generischen Datum fest (1/1/2000 oder etwas Konsequentes & nicht spezifisch) - Sie ignorieren den Datumsteil der Reisezeit, können aber noch zeitbasierte Vergleiche machen, wenn notwendig, ohne eine Zeichenfolge in einen Zeitwert zu konvertieren.

Verwandte Themen