$dateSubtract
聚合运算符将Date()
对象按指定的时间单位递减。从版本5.0开始支持。
语法
{
$dateSubtract: {
startDate: <Expression>,
unit: <Expression>,
amount: <Expression>,
timezone: <tzExpression>
}
}
返回一个日期对象Date()
,startDate
可以是任何能被解析为日期、时间戳或对象Id的表达式,这三种类型都会返回Date()
对象。
参数字段说明:
|字段|是否必须|描述|
|-|-|
|startDate
|是|开始日期(UTC),可以是日期、时间戳或对象Id表达式|
|unit
|是|要增加的时间的单位,单位可以是能被解析为下列值的表达式:year
、quarter
、week
、month
、day
、hour
、minute
、second
、millisecond
|
|amount
|是|以units
为单位,在startDate
基础上的增量,amount
是可以被解析为整数、小数或双精度数的表达式|
|timezone
|否|执行操作的时区,<tzExpression>
必须是能被解析为奥尔森时区标识符格式的字符串或UTC偏移量,如果timezone
不指定,返回值显示为UTC
|
使用
时间测量
MongoDB遵循流行的数据库用法,以UTC为时间单位工作。dateSubtract
表达式总是以 UTC 为起始日期,并以 UTC 为结果返回。如果指定了时区,计算将使用指定的时区进行。当计算涉及夏令时(DST)时,时区尤为重要。
如果单位是一个月或更大,操作会根据该月的最后一天进行调整。例如,在 10 月的最后一天增加一个月,这就是 "月末最后一天 "调整。
{
$dateSubtract:
{
startDate: ISODate("2021-03-31T12:10:05Z"),
unit: "month",
amount: 1
}
}
注意:返回的日期ISODate("2020-11-30T12:10:05Z")
是30日,而不是 31日,因为11月的天数比10月少。
时区
在<timezone>
字段中使用 Olson 时区标识符时,MongoDB 会应用 DST 偏移(如果适用于指定的时区)。
例如,包含以下文件的sales
集合:
{
"_id" : 1,
"item" : "abc",
"price" : 20,
"quantity" : 5,
"date" : ISODate("2017-05-20T10:24:51.303Z")
}
下面的聚合说明了 MongoDB 如何处理 Olson 时区标识符的 DST 偏移量。示例使用$hour
和$minute
操作符返回日期字段的相应部分:
db.sales.aggregate([
{
$project: {
"nycHour": {
$hour: {
date: "$date", timezone: "-05:00" }
},
"nycMinute": {
$minute: {
date: "$date", timezone: "-05:00" }
},
"gmtHour": {
$hour: {
date: "$date", timezone: "GMT" }
},
"gmtMinute": {
$minute: {
date: "$date", timezone: "GMT" } },
"nycOlsonHour": {
$hour: {
date: "$date", timezone: "America/New_York" }
},
"nycOlsonMinute": {
$minute: {
date: "$date", timezone: "America/New_York" }
<