我已经编写了以下代码来使用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, 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式的";获取某个表的最大值的方法,尤其是在涉及日期的情况下。
您可以在SQL中使用max
操作。也许这不是一种更"GORM"的方式,但在我看来,这是一个语义更正确/更有吸引力的版本:
var result float64
row := db.Table("temperatures").Where("ts BETWEEN ? AND ?", start, end).Select("max(temperature)").Row()
err := row.Scan(&result)
您可以将其作为温度结构的一种方法,如下所示:
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
}