2016-09-14 12 views
1

Ich bin derzeit eine Zeit-String-Parsing und an den db (Postgresql) zu speichern:Wie spart man Zeit in der Datenbank in Go bei der Verwendung von GORM und Postgresql?

event.Time, _ := time.Parse("3:04 PM", "9:00 PM") 
// value of event.Time now is: 0000-01-01 21:00:00 +0000 UTC 
db.Create(&event) 

Es gibt mir diese Fehlermeldung: pq: R:"DateTimeParseError" S:"ERROR" C:"22008" M:"date/time field value out of range: \"0000-01-01T21:00:00Z\"" F:"datetime.c" L:"3540"

event.Time⁠⁠⁠⁠ ‚s-Typ ist time.Time.

Ich habe auch versucht event.Time ‚s Typ String Einstellung und Zeitdatentyp in postgresql mit:

type Event struct { 
    Time string `gorm:"type:time 
} 

Aber jetzt einen Fehler erhalte ich, wenn Datensätze in der db holen:

sql: Scan error on column index 4: unsupported driver -> Scan pair: time.Time -> *string 
+0

Das ist, weil Go time.Time eigentlich ein Datum ist. Momentan sehe ich keine Möglichkeit, PostgreSQL Time richtig zu benutzen. Wenn Sie nicht danach fragen, würde ich vorschlagen, eine einfache Zeichenfolge zu verwenden. Andernfalls speichern Sie es als ein vollständiges Datum. –

+0

@AlexeySoshin Ich habe bereits versucht, es als ein vollständiges Datum zu speichern, aber es gibt mir diesen Fehler: 'pq: R:" DateTimeParseError "S:" FEHLER "C:" 22008 "M:" Datum/Uhrzeit Feldwert außerhalb des Bereichs: \ "0000-01-01T21: 00: 00Z \" "F:" datetime.c "L:" 3540 "' –

+1

Als Workaround würde ich vorschlagen, ein Dummy-Datum wie 2099-01-01 hinzuzufügen und dann zu speichern Ihre Zeit und die Frage dazu richtig zu diesem Thema. –

Antwort

2

Untersuchte dieses Problem weiter. Derzeit gibt es keine Unterstützung in GORM für alle Datum/Zeit-Typen außer timestamp with time zone

Sehen Sie diesen Teil des Codes von dialect_postgres.go:

case reflect.Struct: 
    if _, ok := dataValue.Interface().(time.Time); ok { 
     sqlType = "timestamp with time zone" 
} 

Also im Grunde sehe ich zwei Möglichkeiten für Sie:

Entweder verwenden varchar(10) in DB und string in Go, ein speichern Sie es einfach als "21.00 Uhr" (wobei 10 eine Zahl, die zu Ihnen passt)

Oder nutzen timestamp with time zone in DB, time.Time in Go, und formatieren Sie das Datum Teil als Konstante Datum, 01.01.1970, zum Beispiel:

time.Parse("2006-01-02 3:04PM", "1970-01-01 9:00PM") 

In diesem Fall werden Sie das Datum Teil in Ihrer Präsentation auslassen müssen, aber wenn Sie planen, um nach Zeitraum zu wählen, könnte das für Sie besser funktionieren.

Verwandte Themen