我之前使用过很多 SQL 数据库;像 Postgres 和 BigQuery 一样,它们具有日期截断功能(例如: date_trunc
或 TIMESTAMP_TRUNC
)。
我想知道mongodb是否有DATE_TRUNC函数?
我找到了$trunc
运算符,但它仅适用于数字。
我想要一个 DATE_TRUNC 函数将给定的日期(其他 SQL 数据库中的时间戳类型)截断到特定的边界,例如年初、月初、小时开始,可以通过获取来组成新的日期年、月、日、时。
有人有某种解决方法吗?特别是对于 WEEK 的开始时刻和 ISOWEEK 的开始,有人有一个好的解决方法吗?
最佳答案
可以组合$dateToParts和 $dateFromParts
对于年、月、日、小时、分钟:
db.getCollection("data").aggregate([
{"$addFields": {
"dateVarFull": {"$dateToParts": {date: {"$toDate" : "2020-08-27T13:00:00Z"}}}
}},
{"$addFields": {
"dateVarTrunc": { "$dateFromParts": {
'year': "$dateVarFull.year",
'month': "$dateVarFull.month",
'day': "$dateVarFull.day"
}}
}}
])
结果:
{
"dateVarFull" : {
"year" : NumberInt(2020),
"month" : NumberInt(8),
"day" : NumberInt(27),
"hour" : NumberInt(13),
"minute" : NumberInt(0),
"second" : NumberInt(0),
"millisecond" : NumberInt(0)
},
"dateVarTrunc" : ISODate("2020-08-27T00:00:00.000+0000")
}
对于week trunc 使用iso8601: true
参数:
db.getCollection("data").aggregate([
{"$addFields": {
"dateVarFull": {
"$dateToParts": {
date: {"$toDate" : "2020-08-27T13:00:00Z"},
iso8601: true
}
}
}},
{"$addFields": {
"dateVarTrunc": { "$dateFromParts": {
'isoWeekYear': "$dateVarFull.isoWeekYear",
'isoWeek': "$dateVarFull.isoWeek",
'isoDayOfWeek': 1
}}
}}
])
结果:
{
"dateVarFull" : {
"isoWeekYear" : NumberInt(2020),
"isoWeek" : NumberInt(35),
"isoDayOfWeek" : NumberInt(4),
"hour" : NumberInt(13),
"minute" : NumberInt(0),
"second" : NumberInt(0),
"millisecond" : NumberInt(0)
},
"dateVarTrunc" : ISODate("2020-08-24T00:00:00.000+0000")
}
关于mongodb - 聚合截断日期函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48351590/