通過golang從mysql中查詢datetime字段,本想參考之前普通類型查詢,只要將變量類型修改為time.Time就可以:
rows, err := db.Query("select login_time from user where id=1") for rows.Next() { var lastLoginTime time.Time err = rows.Scan(&lastLoginTime) if err != nil { panic(err) } fmt.Println(lastLoginTime) }
運行代碼並沒有得到預期的結果,運行出錯,err信息為:
sql: Scan error on column index 1: unsupported driver -> Scan pair: []uint8 -> *time.Time
通過google得出的解決方法是先將datetime的字面值賦值給string變量。然后通過time.Parse(layout, value)轉換為time.Time類型
var lastLoginTime string err = rows.Scan(&lastLoginTime) loginTime, _ := time.Parse("2006-01-02 15:04:05", lastLoginTime) fmt.Println(loginTime)
運行結果為
2018-05-22 13:22:51 +0000 UTC
這里為UTC時間,如果需要使用當地時區可以使用time.ParseInLocation(layout, value, loc)指定當地時區
DefaultTimeLoc := time.Local loginTime, err := time.ParseInLocation("2006-01-02 15:04:05", lastLoginTime, DefaultTimeLoc)
完整代碼
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
"time"
)
func main() {
db, err := sql.Open("mysql", "root:root@tcp(localhost:3306)/golang?charset=utf8")
checkErr(err)
rows, err := db.Query("select id,login_time from user where id=1")
checkErr(err)
for rows.Next() {
var id int
var lastLoginTime string
err = rows.Scan(&id, &lastLoginTime)
checkErr(err)
DefaultTimeLoc := time.Local
loginTime, err := time.ParseInLocation("2006-01-02 15:04:05", lastLoginTime, DefaultTimeLoc)
checkErr(err)
fmt.Println(loginTime)
}
db.Close()
}
func checkErr(err error) {
if err != nil {
panic(err)
}
}
