1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- // Go MySQL Driver - A MySQL-Driver for Go's database/sql package
- //
- // Copyright 2013 The Go-MySQL-Driver Authors. All rights reserved.
- //
- // This Source Code Form is subject to the terms of the Mozilla Public
- // License, v. 2.0. If a copy of the MPL was not distributed with this file,
- // You can obtain one at http://mozilla.org/MPL/2.0/.
- package mysql
- import (
- "database/sql"
- "database/sql/driver"
- "fmt"
- "time"
- )
- // NullTime represents a time.Time that may be NULL.
- // NullTime implements the Scanner interface so
- // it can be used as a scan destination:
- //
- // var nt NullTime
- // err := db.QueryRow("SELECT time FROM foo WHERE id=?", id).Scan(&nt)
- // ...
- // if nt.Valid {
- // // use nt.Time
- // } else {
- // // NULL value
- // }
- //
- // # This NullTime implementation is not driver-specific
- //
- // Deprecated: NullTime doesn't honor the loc DSN parameter.
- // NullTime.Scan interprets a time as UTC, not the loc DSN parameter.
- // Use sql.NullTime instead.
- type NullTime sql.NullTime
- // Scan implements the Scanner interface.
- // The value type must be time.Time or string / []byte (formatted time-string),
- // otherwise Scan fails.
- func (nt *NullTime) Scan(value any) (err error) {
- if value == nil {
- nt.Time, nt.Valid = time.Time{}, false
- return
- }
- switch v := value.(type) {
- case time.Time:
- nt.Time, nt.Valid = v, true
- return
- case []byte:
- nt.Time, err = parseDateTime(v, time.UTC)
- nt.Valid = (err == nil)
- return
- case string:
- nt.Time, err = parseDateTime([]byte(v), time.UTC)
- nt.Valid = (err == nil)
- return
- }
- nt.Valid = false
- return fmt.Errorf("can't convert %T to time.Time", value)
- }
- // Value implements the driver Valuer interface.
- func (nt NullTime) Value() (driver.Value, error) {
- if !nt.Valid {
- return nil, nil
- }
- return nt.Time, nil
- }
|