Golang Go语言中 gorm 自动生成的模型,数据库数据类型是 date,模型生成的类型是 time.Time,生成的查询变成了 datetime 格式的,怎么设置能查询正确?

模型时 gorm 的 gen 工具自动生成的:

Date      time.Time `gorm:"column:date;type:date;not null;comment:日期" json:"date"`

生成的查询

`date` = '2023-11-07 08:00:00' LIMIT 1

要怎么设置才能生成日期格式时2023-11-07的正确查询?


Golang Go语言中 gorm 自动生成的模型,数据库数据类型是 date,模型生成的类型是 time.Time,生成的查询变成了 datetime 格式的,怎么设置能查询正确?

更多关于Golang Go语言中 gorm 自动生成的模型,数据库数据类型是 date,模型生成的类型是 time.Time,生成的查询变成了 datetime 格式的,怎么设置能查询正确?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

你可以试试 https://github.com/golang-module/carbon#json-handling
Date 类型设置为 <a target="_blank" href="http://carbon.Date" rel="nofollow noopener">carbon.Date</a>

更多关于Golang Go语言中 gorm 自动生成的模型,数据库数据类型是 date,模型生成的类型是 time.Time,生成的查询变成了 datetime 格式的,怎么设置能查询正确?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


dsn 里加上 parseTime=True&loc=Local

直接用字符串呗,不一定非要传 time.Time 对象吧。

db.Debug().Model(&Data{}).Where(“date = ?”, time.Now().Format(time.DateOnly)).Limit(5).Find(&data)

之前用的自动生成查询的方法,参数得传 time.Time 对象,我另外写了一个,用字符串,和你一样的了

在 Go 语言中使用 GORM(Golang ORM)时,遇到数据库数据类型为 date 而模型生成的类型是 time.Time,且查询时格式变为 datetime 的问题,可以通过以下方式解决:

  1. 自定义扫描和值设置: GORM 允许你通过实现 ScannerValuer 接口来自定义字段的扫描和设置。你可以创建一个自定义类型,比如 Date,并实现这两个接口,确保在扫描和设置时只处理日期部分。

  2. 使用 SQL 转换函数: 在查询时,使用 SQL 转换函数将 datetime 转换为 date。例如,对于 MySQL,可以使用 DATE() 函数:

    var results []YourModel
    db.Raw("SELECT *, DATE(your_datetime_column) as your_date_column FROM your_table WHERE DATE(your_datetime_column) = ?", yourDate).Scan(&results)
    
  3. 配置 GORM 类型映射: GORM 提供了注册自定义类型的方式,可以指定类型到 SQL 类型的映射。但此方法对于日期和时间的处理较为有限,通常用于更复杂的自定义类型。

  4. 修改数据库模型: 如果可能,考虑将数据库中的数据类型从 date 改为 datetime,以匹配 GORM 的 time.Time 类型。这样可以避免格式转换的问题,但可能涉及数据迁移。

推荐使用第二种方法,通过 SQL 转换函数,因为这种方法相对简单且易于维护,同时避免了修改现有数据库模型或引入额外的复杂性。

回到顶部