今天遇到了一些问题。
基本上,我需要在完成查询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
}
'date'var显然是数据库查询中的所有日期。
日期的格式为:2017-10-01
(例如10月1日),10月份约为300,11月份为100。
基本上,从这里开始,我需要将所有值(视图和展示次数)相加,但仅限于每个日期范围。
所以我会得到类似的结果:
2017-10-01
至2017-10-31
的展示次数为54
次
2017-10-01
至2017-10-07
以5
次展示为例。
知道我怎么会遇到这个问题吗? 希望我解释得很好,并感谢先进。
答案 0 :(得分:0)
因此,在这些情况下最好的选择是使用地图式策略来跟踪。例如,map [date]数据允许您为每个日期保留唯一条目。但是,日期有一个有益的优化,因为它们可以很容易地用整数表示(一年中的某一天),并且选项的数量足够小,不会成为内存问题。这意味着我们可以使用切片而不是地图,并获得排序的好处(Go地图在for循环中随机排序),同时仍然使用喜欢地图。例如:
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...
}