我编写了以下代码,用GORM获得某个值的每日最大值.

  1. 我通过当前时间,得到一天的开始和结束.
  2. 我 Select 一天开始和结束之间的所有值.
  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)

你可以将其作为温度 struct 的一种方法,如下所示:

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
}

Go相关问答推荐

向API网关终结点发出POST请求时出现AWS Lambda With Go:";Rune me.InvalidEntrypoint";错误

如何使用GRPC UnaryClientInterceptor中的`maily`参数?

带有条件的for循环中缺少RETURN语句

MaybeReadByte对通道的使用如何在Go中提供随机行为?

如何使用Gio设置标题栏图标

如何配置vscode以在Go中显示不必要的(过度指定的)泛型?

可以';t从主机连接到ScyllaDB容器

正则表达式模式,确保至少一个字符与其他条件一起存在

Json.Unmarshal() 和 gin.BindJson() 之间的区别

如何在正则表达式中使整个单词可选?

我应该先解锁然后再广播吗?

MQTT 客户端没有收到另一个客户端发送的消息

上传图片失败,出现错误dial tcp: lookup api.cloudinary.com: no such host

Go 的垃圾收集器在使用时删除 ZeroMQ 套接字

在 Go 中将指针传递给函数的正确方法是什么,以便我可以读取和/或修改指针表示的值?

将 Simple Go Web 应用程序部署到 Elastic Beanstalk

从 Go struct 中提取标签作为 reflect.Value

为什么 Go 中的 maps.Keys() 将 map 类型指定为 M?

如何正确解组不同类型的数组?

SSH 连接超时