2016-09-14 14 views
1

私は現在時刻文字列を解析し、デシベル(Postgresqlの)に保存しています:GORMとPostgreSQLを使用している場合、Goのデータベースの時間を節約する方法は?

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) 

それは私にこのエラーを与えている: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⁠⁠⁠⁠のタイプはtime.Timeです。

私はまた、文字列にevent.Timeの種類を設定し、PostgreSQLの時間データ型を使用してみました:

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

しかし、DB内のレコードを取得する際に、今、私はエラーを取得しています:

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

Go Time.Timeは実際には日付なので、現在私はPostgreSQL Timeを適切に使用する方法は見当たりません。あなたがそれで質問していないなら、私は単純な文字列を使うことを提案します。それ以外の場合は、完全な日付として保管してください。 –

+0

@AlexeySoshin 'pq:R:" DateTimeParseError "S:" ERROR "C:" 22008 "M:"日付/時刻フィールドの値が範囲外です: \ "0000-01-01T21:00:00Z \" "F:" datetime.c "L:" 3540 "' –

+1

回避策として、2099-01-01のようなダミーの日付を追加することをお勧めします。あなたの時間とこれを念頭に置いて正しく質問してください。 –

答えて

2

この問題をさらに調査しました。

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

だから、基本的に、私はあなたのための2つのオプションを参照してください:どちらか一方

varchar(10)を使用する現在、timestamp with time zone

以外の任意の日付/時刻型用GORMにはサポートがdialect_postgres.goからのコードのこの部分を参照してくださいありませんDB内でstring、単に「9:00 PM」(10はあなたに合った数字)を保存してください。

またはtimestamp with time zoneをDBに、ゴーで、例えば、一定の日付、1970年1月1日としてあなたの日付部分をフォーマットする:あなたはあなたのプレゼンテーションに日付部分を省略する必要がありますその場合

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

が、あなたが計画している場合日付範囲で選択すると、それはあなたのためにうまくいく可能性があります。

関連する問題