今天遇到了一个问题。
基本上,在完成查询SELECT * FROM <DB>
之后,我需要选择某个日期范围。
例如:
var (date string
views int
impressions int)
for query.Next() {
err := query.Scan(&date, &views, &impressions)
// handle the err
// get the range of dates for each month
// add up all the views and impressions in that specific range
}
显然,“日期”变量将是数据库查询中的所有日期。
日期的格式为:
2017-10-01
(以10月1日为例),十月大约有300个,十一月大约有100个。基本上从这里开始,我需要将所有值(视图和展示次数)加起来,但仅按日期范围进行加总。
所以我会得到类似:
2017-10-01
到2017-10-31
具有54
展示次数2017-10-01
到2017-10-07
以5
印象为例。知道我将如何解决这个问题吗?
希望我能解释这个问题,并在此先感谢。
最佳答案
因此,在这些情况下,最好的选择是使用 map 样式的策略进行跟踪。例如,map [date]数据将允许您为每个日期保留唯一的条目。但是,日期有一个有益的优化,因为它们可以轻松地用整数(一年中的一天)表示,并且选项的数量足够小,不会引起内存问题。这意味着我们可以使用 slice 而不是 map 来获得排序的好处(Go map 在for循环中是随机排序的),同时仍然像 map 一样使用 slice 。例如:
type Data struct {
// fields
}
const dateFormat = "2006-01-02" // only parse the date
dayStats := make([]Data, 366) // account for leap years
for query.Next() {
var datestr string // can make this a time.Time, if your date format scans properly
var dr Data
if err := query.Scan(datestr, /* other fields */ ); err != nil {
log.Fatal(err)
}
date, err := time.Parse(datestr)
if err != nil {
log.Fatal(err)
}
dayStats[date.YearDay()].someField += dr.someField
dayStats[date.YearDay()].someOtherField += dr.someOtherField
// other fields...
}
现在假设我们要计算10月1日至10月31日之间的统计信息:
start := time.Date(2017, time.October, 1, 0, 0, 0, 0, time.UTC)
end := time.Date(2017, time.October, 31, 0, 0, 0, 0, time.UTC)
var total Data
for day := start.YearDay(); day <= end.YearDay(); day++ {
total.someField += dayStats[day].someField
total.someOtherField += dayStats[day].someOtherField
// other fields...
}
关于sql - 在SQL查询之间获取多个日期范围并相应地添加数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47161559/