github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/go-xorm/core/scan.go (about) 1 package core 2 3 import ( 4 "database/sql/driver" 5 "fmt" 6 "time" 7 ) 8 9 type NullTime time.Time 10 11 var ( 12 _ driver.Valuer = NullTime{} 13 ) 14 15 func (ns *NullTime) Scan(value interface{}) error { 16 if value == nil { 17 return nil 18 } 19 return convertTime(ns, value) 20 } 21 22 // Value implements the driver Valuer interface. 23 func (ns NullTime) Value() (driver.Value, error) { 24 if (time.Time)(ns).IsZero() { 25 return nil, nil 26 } 27 return (time.Time)(ns).Format("2006-01-02 15:04:05"), nil 28 } 29 30 func convertTime(dest *NullTime, src interface{}) error { 31 // Common cases, without reflect. 32 switch s := src.(type) { 33 case string: 34 t, err := time.Parse("2006-01-02 15:04:05", s) 35 if err != nil { 36 return err 37 } 38 *dest = NullTime(t) 39 return nil 40 case []uint8: 41 t, err := time.Parse("2006-01-02 15:04:05", string(s)) 42 if err != nil { 43 return err 44 } 45 *dest = NullTime(t) 46 return nil 47 case nil: 48 default: 49 return fmt.Errorf("unsupported driver -> Scan pair: %T -> %T", src, dest) 50 } 51 return nil 52 }