Golang中如何将日期数据存储到MySQL数据库

Golang中如何将日期数据存储到MySQL数据库 我们的日期格式为“dd/mm/yyyy”,而MySQL接受的格式是“yyyy-mm-dd”。

如何将“dd/mm/yyyy”格式转换为“yyyy-mm-dd”格式?

我们需要将其插入到MySQL数据库中。

17 回复

驱动程序难道不能直接处理 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,无需再进行任何来回转换。

我仍然没有在这里看到数据库查询。无论你做什么,都是在绕开实际问题……

最终,mydatedate 实际上会是相等的!试试看,mydate == date 将永远成立!

你好,

抱歉,但你似乎有些混淆。 你能发布你正在使用的JSON和确切的结构体吗?

然后,你还应该展示用于插入数据库的代码。 工作流程应该是:

  • 将JSON数据反序列化到结构体中
  • 将结构体存储到数据库中

请使用反引号来正确格式化您的代码,如下所示:

// 代码放在这里

将呈现为:

// 代码放在这里

那么您是如何查询数据库的呢?结构体中的 XlOpendate 字段已经是 time.Time 类型,除非您的数据库查询写得比较奇怪,否则我认为它应该能正常工作。

我仍然感到困惑。

如果我将 Xlopendate 字段设为 Time.time,我会遇到这个错误:

{
    "Binding exception": "parsing time "\"31-04-2022\"" as "\"2006-01-02T15:04:05Z07:00\"": cannot parse \"4-2022\"" as \"2006\""
}

如果我使用字符串类型,我就必须进行转换。

  1. mydate, err := time.Parse("02-01-2006", data.XlOpendate):字符串 → 时间 答案:使用 “DD/MM/YYYY” 格式将字符串转换为时间

  2. str_date := mydate.Format(Mysqldateformat):时间 → 字符串 答案:将时间转换为字符串

  3. date, err := time.Parse(Mysqldateformat, str_date):字符串 → 时间 答案:转换为 MySQL 日期格式 (YYYY/MM/DD)。

我看到你正在进行双重转换,我不明白为什么这样做

  1. mydate, err := time.Parse("02-01-2006", data.XlOpendate): 字符串 → 时间
  2. str_date := mydate.Format(Mysqldateformat): 时间 → 字符串
  3. 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

关键点:

  1. 使用time.Parse()解析原始日期字符串
  2. 布局字符串"02/01/2006"对应"dd/mm/yyyy"格式
  3. 使用Format("2006-01-02")转换为MySQL格式
  4. 使用参数化查询防止SQL注入
回到顶部