我有一个MongoDB,它将日期对象存储在协调世界时。嗯,我想按不同时区(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);或者,如果您使用命令行(未测试,我只测试了java版本):
{
$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',这是不同的一天。
发布于 2013-09-17 23:43:58
我不是CET及其与协调世界时的关系方面的专家,但是下面的代码(用于shell)应该正确地转换(添加一个小时)到MongoDB日期类型:
db.dates.aggregate(
{$project: {"tDate":{$add: ["$tDate", 60*60*1000]}, "eventCount":1, "customer":1}}
)如果在管道其余部分之前运行project命令,则结果应为CET格式。
发布于 2018-03-20 23:17:07
您可以将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}
}
}发布于 2014-11-20 03:06:04
经过几个小时的搜索,这就是对我有效的解决方案。它也非常简单。只需通过减去以毫秒为单位的时区偏移量来转换时区。
25200000 =7小时偏移量// 420min*60秒*1000mili
$group: {
_id = {
year: { $year : [{ $subtract: [ "$timestamp", 25200000 ]}] },
month: { $month : [{ $subtract: [ "$timestamp", 25200000 ]}] },
day: { $dayOfMonth : [{ $subtract: [ "$timestamp", 25200000 ]}] }
},
count = {
$sum : 1
}
};https://stackoverflow.com/questions/18852095
复制相似问题