如何在不同的时区按年 - 月 - 日汇总

SQL*_*ion 23 mongodb mongo-java

我有一个MongoDB,它以UTC格式存储日期对象.好吧,我想在不同的时区(CET)按年,月份进行汇总.

这样做,适用于UTC:

    BasicDBObject group_id = new BasicDBObject("_id", new BasicDBObject("year", new BasicDBObject("$year", "$tDate")).
                append("month", new BasicDBObject("$month", "$tDate")).
                append("day", new BasicDBObject("$dayOfMonth", "$tDate")).
                append("customer", "$customer"));

    BasicDBObject groupFields = group_id.
            append("eventCnt", new BasicDBObject("$sum", "$eventCnt")); 

    BasicDBObject group = new BasicDBObject("$group", groupFields);
Run Code Online (Sandbox Code Playgroud)

或者,如果您使用命令行(未测试,我只测试了java版本):

{
    $group: {
        _id: {
            "year": {
                "$year", "$tDate"
            },
            "month": {
                "$month", "$tDate"
            },
            "day": {
                "$dayOfMonth", "$tDate"
            },
            "customer": "$customer"
        },
        "eventCount": {
            "$sum": "$eventCount"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如何在聚合框架内将这些日期转换为CET?

例如'2013-09-16 23:45:00 UTC'是'2013-09-17 00:45:00 CET',这是另一天.

3rf*_*3rf 15

我不是CET及其与UTC的关系的专家,但是下面的代码(对于shell)应该对MongoDB日期类型进行适当的转换(添加一小时):

db.dates.aggregate(
  {$project: {"tDate":{$add: ["$tDate", 60*60*1000]}, "eventCount":1, "customer":1}}
)
Run Code Online (Sandbox Code Playgroud)

如果在管道的其余部分之前运行该项目命令,则结果应该在CET中.


小智 7

搜索了几个小时后,这个解决方案对我有用.它也很简单.只需通过减去时区偏移量(以毫秒为单位)来转换时区.

25200000 = 7小时偏移// 420分钟*60秒*1000米

$group: {
    _id = { 
        year: { $year : [{ $subtract: [ "$timestamp", 25200000 ]}] }, 
        month: { $month : [{ $subtract: [ "$timestamp", 25200000 ]}] }, 
        day: { $dayOfMonth : [{ $subtract: [ "$timestamp", 25200000 ]}] }
    },
    count = { 
        $sum : 1
    }
};
Run Code Online (Sandbox Code Playgroud)

  • 由于夏令时,这可能是错误的一半时间.大多数使用CET的国家在某个随机日期切换到CEST夏季; 那么差异是+2小时,而不是+1.例如,参见[this](http://www.timeanddate.com/time/zones/cet). (3认同)

use*_*814 7

您可以提供timezone从3.6开始的日期运算符.

用您的时区替换时区.

{
  "$group":{
    "_id":{
      "year":{"$year":{"date":"$tDate","timezone":"America/Chicago"}},
      "month":{"$month":{"date":"$tDate","timezone":"America/Chicago"}},
      "dayOfMonth":{"$dayOfMonth":{"date":"$tDate","timezone":"America/Chicago"}}
    },
    "count":{"$sum":1}
  }
}
Run Code Online (Sandbox Code Playgroud)