为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
缥缈止盈 2022-11-28 16:53:43
我编写了以下代码以使用 GORM 获取特定值的每日最大值。我通过当前时间并获得一天的开始和结束。我选择了一天开始和结束之间的所有值。我订购了温度并获得了第一个。我的代码: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, nilfunc 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”方法来获取某个表的最大值,尤其是当涉及日期时。
查看完整描述

1 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

您可以max在 SQL 中使用该操作。也许不是更“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

}


查看完整回答
反对 回复 2022-11-28
  • 1 回答
  • 0 关注
  • 294 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信