Golang中如何将日期数据存储到MySQL数据库
Golang中如何将日期数据存储到MySQL数据库 我们的日期格式为“dd/mm/yyyy”,而MySQL接受的格式是“yyyy-mm-dd”。
如何将“dd/mm/yyyy”格式转换为“yyyy-mm-dd”格式?
我们需要将其插入到MySQL数据库中。
驱动程序难道不能直接处理 Time 类型的变量吗?
更多关于Golang中如何将日期数据存储到MySQL数据库的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
数据库驱动程序难道不能在不转换为字符串的情况下将 Time 转换为正确的格式吗?
你使用的是哪个驱动程序?
能否展示一下您是如何插入的示例?您是将日期存储为MySQL的字符串数据类型之一,比如CHAR或VARCHAR吗?如果不是,那么日期字符串的格式应该无关紧要。
packs:
我们的日期格式是“dd/mm/yyyy”
你难道不是将日期存储为 time.Time 类型吗?
数据库驱动难道不能为它们使用正确的格式吗?
请展示代码
只需使用一个能在查询中正确转换 time.Time 的 SQL 构建器……说实话,我期望所有基础的 SQL 库都能处理这个问题……
那么 XlOpendate 不是 time.Time 类型吗?这样的话,你之前提供的信息就是错误且有误导性的。
无论如何,根据你最后那段代码片段,你可以直接使用 mydate,无需再进行任何来回转换。
我仍然没有在这里看到数据库查询。无论你做什么,都是在绕开实际问题……
最终,mydate 和 date 实际上会是相等的!试试看,mydate == date 将永远成立!
你好,
抱歉,但你似乎有些混淆。 你能发布你正在使用的JSON和确切的结构体吗?
然后,你还应该展示用于插入数据库的代码。 工作流程应该是:
- 将JSON数据反序列化到结构体中
- 将结构体存储到数据库中
请使用反引号来正确格式化您的代码,如下所示:
// 代码放在这里
将呈现为:
// 代码放在这里
那么您是如何查询数据库的呢?结构体中的 XlOpendate 字段已经是 time.Time 类型,除非您的数据库查询写得比较奇怪,否则我认为它应该能正常工作。
-
mydate, err := time.Parse("02-01-2006", data.XlOpendate):字符串 → 时间 答案:使用 “DD/MM/YYYY” 格式将字符串转换为时间 -
str_date := mydate.Format(Mysqldateformat):时间 → 字符串 答案:将时间转换为字符串 -
date, err := time.Parse(Mysqldateformat, str_date):字符串 → 时间 答案:转换为 MySQL 日期格式 (YYYY/MM/DD)。
我看到你正在进行双重转换,我不明白为什么这样做
mydate, err := time.Parse("02-01-2006", data.XlOpendate): 字符串 → 时间str_date := mydate.Format(Mysqldateformat): 时间 → 字符串date, err := time.Parse(Mysqldateformat, str_date): 字符串 → 时间
为什么不直接使用 mydate 呢?
提示:为什么不将字段定义为 Time 类型,并为该结构体实现 UnmarshalJSON() 方法?
func main() {
fmt.Println("hello world")
}
现在可以正常工作了。
mydate, err := time.Parse("02-01-2006", data.XlOpendate) //dd/mm/yyyy
if err != nil {
err := errors.New("Parsing error" + err.Error())
return err
}
str_date := mydate.Format("2006-02-01") // formated in YYYY/MM/DD
date, err := time.Parse("2006-02-01", str_date) // transafer to Date object
if err != nil {
err := errors.New("Parsing error" + err.Error())
return err
}
问题已解决。这是正确的方法。
{
"material_code": 3702,
"Sitename": "https://xyz.abc.com",
"datatype": "OUTSIDE",
"XlOpendate": "31-05-2022"
}
Xlopendate 格式为 “DD/MM/YYYY”
type Excelwebsitelist struct {
Material_code int `json:"material_code" validate:"required"`
Sitename string `json:"sitename" validate:"required"`
datatype string `json:"studenttype" validate:"required"`
XlOpendate time.Time `json:"xlopendate" validate:"required"`
}
我们正在使用 Gin 框架。
我们希望将数据插入到 MySQL 表中(XlOpendate 字段为日期类型)。
[{
"Website_code": 3702,
"Sitename": "https://xyz.abc.com",
"datatype": "OUTSIDE",
"XlOpendate": "31-05-2022",
"Remarks":"dummy data"
}]
type Excelwebsitelist struct {
Website_code int `json:"website_code" validate:"required"`
Sitename string `json:"sitename" validate:"required"`
Datatype string `json:"datatype" validate:"required"`
XlOpendate string `json:"xlopendate" validate:"required"`
Remarks string `json:"remarks" validate:"required"`
Opendate time.Time
}
func Uploaddata(_in []req.Excelwebsitelist) error {
tx, err := Mydb.Beginx()
if err != nil {
err := errors.New("database error" + err.Error())
return err
}
defer func(tx *sqlx.Tx) {
if err != nil {
_ = tx.Rollback()
} else {
_ = tx.Commit()
}
}(tx)
for index, data := range _in {
mydate, err := time.Parse("02-01-2006", data.XlOpendate) //dd/mm/yyyy
if err != nil {
err := errors.New("Parsing error" + err.Error())
return err
}
str_date := mydate.Format(Mysqldateformat) // formated in YYYY/MM/DD
date, err := time.Parse(Mysqldateformat, str_date) // transafer to Date object
if err != nil {
err := errors.New("Parsing error" + err.Error())
return err
}
_in[index].Opendate = date
}
_InsertQuery := `
insert into website (
website_code,sitename,datatype,opendate ,remarks
) values (:website_code,:sitename,:datatype,:opendate ,:remarks)
ON DUPLICATE KEY UPDATE
datatype =VALUES(datatype),opendate = VALUES(opendate),remarks = values(remarks)`
_, err = tx.NamedExec(_InsertQuery, _in)
if err != nil {
return err
}
return nil
}
我们从用户那里获取了字符串格式的“datetime”,并在运行时将其转换为TIME.time,然后保存到数据库中。
我认为这是一种错误的编程方式。
在Go中,你可以使用time包来解析和格式化日期。以下是将“dd/mm/yyyy”格式转换为“yyyy-mm-dd”格式并插入MySQL数据库的示例代码:
package main
import (
"database/sql"
"fmt"
"log"
"time"
_ "github.com/go-sql-driver/mysql"
)
func main() {
// 连接MySQL数据库
db, err := sql.Open("mysql", "username:password@tcp(127.0.0.1:3306)/dbname")
if err != nil {
log.Fatal(err)
}
defer db.Close()
// 原始日期字符串
dateStr := "25/12/2023"
// 解析日期
// 注意:Go的time包使用特定的布局字符串
// "02"表示日,"01"表示月,"2006"表示年
parsedTime, err := time.Parse("02/01/2006", dateStr)
if err != nil {
log.Fatal("解析日期失败:", err)
}
// 格式化为MySQL接受的格式
mysqlDate := parsedTime.Format("2006-01-02")
// 插入数据库
query := "INSERT INTO your_table (date_column) VALUES (?)"
_, err = db.Exec(query, mysqlDate)
if err != nil {
log.Fatal("插入数据库失败:", err)
}
fmt.Println("日期已成功插入:", mysqlDate)
}
如果你需要处理多个日期或从其他数据源获取日期,可以使用以下函数:
func convertToMySQLDate(dateStr string) (string, error) {
t, err := time.Parse("02/01/2006", dateStr)
if err != nil {
return "", err
}
return t.Format("2006-01-02"), nil
}
// 使用示例
mysqlDate, err := convertToMySQLDate("15/08/2023")
if err != nil {
log.Fatal(err)
}
// mysqlDate 现在是 "2023-08-15"
对于批量插入操作:
func insertDates(db *sql.DB, dates []string) error {
query := "INSERT INTO your_table (date_column) VALUES (?)"
for _, dateStr := range dates {
mysqlDate, err := convertToMySQLDate(dateStr)
if err != nil {
return err
}
_, err = db.Exec(query, mysqlDate)
if err != nil {
return err
}
}
return nil
}
确保你已经安装了MySQL驱动:
go get -u github.com/go-sql-driver/mysql
关键点:
- 使用
time.Parse()解析原始日期字符串 - 布局字符串"02/01/2006"对应"dd/mm/yyyy"格式
- 使用
Format("2006-01-02")转换为MySQL格式 - 使用参数化查询防止SQL注入


