获取SQL查询之间的多个日期范围并相应地添加数据

时间:2017-11-07 15:26:19

标签: sql go

今天遇到了一些问题。

基本上,我需要在完成查询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-012017-10-31的展示次数为542017-10-012017-10-075次展示为例。

知道我怎么会遇到这个问题吗? 希望我解释得很好,并感谢先进。

1 个答案:

答案 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...
}