sql-server - 如何在 Gorm 中获取特定日期的最大值?

标签 sql-server go go-gorm

我编写了以下代码来使用 GORM 获取特定值的每日最大值。

  1. 我传递当前时间并获取一天的开始和结束时间。
  2. 我选择一天开始和结束之间的所有值。
  3. 我订购温度并获得第一个。

我的代码:

func GetDailyMaxTemperature(ts time.Time) (*Temperature, error) {
    temp:= &Temperature{}
    start, end := getStartAndEndOfDay(ts)
    if tx := db.Where("ts BETWEEN ? AND ?", start, end).Order("temperature ASC").First(temp); tx.Error != nil {
        return temp, tx.Error
    }
    return temp, nil

func getStartAndEndOfDay(ts time.Time) (time.Time, time.Time) {
    dayStart := time.Date(ts.Year(), ts.Month(), ts.Day(), 0, 0, 0, 0, ts.Location())
    dayEnd := time.Date(ts.Year(), ts.Month(), ts.Day(), 23, 59, 59, 999, ts.Location())
    return dayStart, dayEnd
}

此代码有效,但我对它不是很满意,想知道是否有更多“GORM-ish”方法来获取某个表的最大值,尤其是在涉及日期时。

最佳答案

您可以在 SQL 中使用 max 操作。也许不是更“GORM”的方式来做到这一点,但在我看来是一个语义上更正确/更具吸引力的版本:

var result float64
row := db.Table("temperatures").Where("ts BETWEEN ? AND ?", start, end).Select("max(temperature)").Row()
err := row.Scan(&result)

您可以像这样将其作为 Temperature 结构的方法:

func (t Temperature) MaxInRange(db *gorm.DB, start, end time.Time) (float64, err) {
  var result float64
  row := db.Table("temperatures").Where("ts BETWEEN ? AND ?", start, end).Select("max(temperature)").Row()
  err := row.Scan(&result)
  return result, err
}

关于sql-server - 如何在 Gorm 中获取特定日期的最大值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71826036/

相关文章:

go - 从 REST API 调用更新对象 - 结构合并?

go - 如何使用 zap.logger 简单地从 stdout 读取(并且无需创建文件)

sql - 检查 varchar 中的字符

sql-server - 使用参数或变量在 SSIS 中设置连接超时?

sql-server - Azure data studio不会重新连接到本地托管的数据库

mysql - 从Golang Gorm查询中获取选定的值

postgresql - GORM 在 postgresql 中更改时间格式

sql-server - 是否可以在旨在插入数据的存储过程中插入当前日期时间?

reflection - 通过反射传递引用嵌套结构

Gorm Scan 未绑定(bind)到结构