从数据库中解析时间

Caf*_*olf 17 database go

我正在使用golang,我正在尝试从mysql中读取时间,我收到以下错误.

var my_time time.Time
rows, err := db.Query("SELECT current_time FROM table")
err := rows.Scan(&my_time)
Run Code Online (Sandbox Code Playgroud)

我得到的错误是

 unsupported driver -> Scan pair: []uint8 -> *time.Time
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?

Not*_*fer 36

假设您正在使用它,go-sql-driver/mysql您可以time.Time通过添加parseTime=true到您的连接字符串,让驱动程序自动扫描DATE和DATETIME .

请参阅https://github.com/go-sql-driver/mysql#timetime-support

示例代码:

db, err := sql.Open("mysql", "root:@/?parseTime=true")
if err != nil {
    panic(err.Error()) // Just for example purpose. You should use proper error handling instead of panic
}
defer db.Close()

var myTime time.Time
rows, err := db.Query("SELECT current_timestamp()")

if rows.Next() {
    if err = rows.Scan(&myTime); err != nil {
        panic(err)
    }
}

fmt.Println(myTime)
Run Code Online (Sandbox Code Playgroud)

请注意,这适用current_timestamp但不适用current_time.如果你必须使用current_time你需要自己解析.

这是您自定义解析的方式:

首先,我们定义一个自定义类型wrap []字节,它将自动解析时间值:

type rawTime []byte

func (t rawTime) Time() (time.Time, error) {
    return time.Parse("15:04:05", string(t))
}
Run Code Online (Sandbox Code Playgroud)

在扫描代码中我们只是这样做:

var myTime rawTime
rows, err := db.Query("SELECT current_time()")

if rows.Next() {
    if err = rows.Scan(&myTime); err != nil {
        panic(err)
    }
}

fmt.Println(myTime.Time())
Run Code Online (Sandbox Code Playgroud)

  • 或者,您可以在结构中使用mysql.NullTime。无论连接字符串设置如何,这都将解析时间,并具有正确处理空值的其他好处。 (2认同)