package types import ( "database/sql/driver" "errors" "time" ) // DateText is an implementation of a string for the MySQL type date. type DateText string // TimeText is an implementation of a string for the MySQL type datetime. type TimeText string const ( formtDate = `2006-01-02` formtTime = `2006-01-02 15:04:05` ) // Value implements the driver.Valuer interface, // and turns the date into a DateText (date) for MySQL storage. func (d DateText) Value() (driver.Value, error) { t, err := time.Parse(formtDate, string(d)) if err != nil { return nil, err } return DateText(t.Format(formtDate)), nil } // Scan implements the sql.Scanner interface, // and turns the bitfield incoming from MySQL into a Date func (d *DateText) Scan(src interface{}) error { v, ok := src.([]byte) if !ok { return errors.New("bad []byte type assertion") } t, err := time.Parse(formtDate, string(v)) if err != nil { return err } *d = DateText(t.Format(formtDate)) return nil } // Value implements the driver.Valuer interface, // and turns the date into a DateText (date) for MySQL storage. func (d TimeText) Value() (driver.Value, error) { t, err := time.Parse(formtDate, string(d)) if err != nil { return nil, err } return TimeText(t.Format(formtTime)), nil } // Scan implements the sql.Scanner interface, // and turns the bitfield incoming from MySQL into a Date func (d *TimeText) Scan(src interface{}) error { v, ok := src.([]byte) if !ok { return errors.New("bad []byte type assertion") } t, err := time.Parse(formtDate, string(v)) if err != nil { return err } *d = TimeText(t.Format(formtTime)) return nil }