首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在不同时区按年-月-日进行聚合

如何在不同时区按年-月-日进行聚合
EN

Stack Overflow用户
提问于 2013-09-17 22:04:17
回答 7查看 12K关注 0票数 24

我有一个MongoDB,它将日期对象存储在协调世界时。嗯,我想按不同时区(CET)中的年、月、日执行聚合。

这样做,对UTC很有效:

代码语言:javascript
复制
    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);

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

代码语言:javascript
复制
{
    $group: {
        _id: {
            "year": {
                "$year", "$tDate"
            },
            "month": {
                "$month", "$tDate"
            },
            "day": {
                "$dayOfMonth", "$tDate"
            },
            "customer": "$customer"
        },
        "eventCount": {
            "$sum": "$eventCount"
        }
    }
}

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

例如'2013-09-16 23:45:00UTC‘是'2013-09-17 00:45:00 CET',这是不同的一天。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-09-17 23:43:58

我不是CET及其与协调世界时的关系方面的专家,但是下面的代码(用于shell)应该正确地转换(添加一个小时)到MongoDB日期类型:

代码语言:javascript
复制
db.dates.aggregate(
  {$project: {"tDate":{$add: ["$tDate", 60*60*1000]}, "eventCount":1, "customer":1}}
)

如果在管道其余部分之前运行project命令,则结果应为CET格式。

票数 16
EN

Stack Overflow用户

发布于 2018-03-20 23:17:07

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

将时区替换为您的时区。

代码语言:javascript
复制
{
  "$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}
  }
}
票数 9
EN

Stack Overflow用户

发布于 2014-11-20 03:06:04

经过几个小时的搜索,这就是对我有效的解决方案。它也非常简单。只需通过减去以毫秒为单位的时区偏移量来转换时区。

25200000 =7小时偏移量// 420min*60秒*1000mili

代码语言:javascript
复制
$group: {
    _id = { 
        year: { $year : [{ $subtract: [ "$timestamp", 25200000 ]}] }, 
        month: { $month : [{ $subtract: [ "$timestamp", 25200000 ]}] }, 
        day: { $dayOfMonth : [{ $subtract: [ "$timestamp", 25200000 ]}] }
    },
    count = { 
        $sum : 1
    }
};
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18852095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档