MongoDB聚合运算符:$dateSubtract

本文介绍了MongoDB中的$dateSubtract聚合运算符,用于日期减法操作,包括处理时区、夏令时调整以及示例展示了如何从登录时间中减去固定数量并根据时区进行调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

$dateSubtract聚合运算符将Date()对象按指定的时间单位递减。从版本5.0开始支持。

语法

{
   
   
   $dateSubtract: {
   
   
      startDate: <Expression>,
      unit: <Expression>,
      amount: <Expression>,
      timezone: <tzExpression>
   }
}

返回一个日期对象Date()startDate可以是任何能被解析为日期、时间戳或对象Id的表达式,这三种类型都会返回Date()对象。

参数字段说明:

|字段|是否必须|描述|
|-|-|
|startDate|是|开始日期(UTC),可以是日期、时间戳或对象Id表达式|
|unit|是|要增加的时间的单位,单位可以是能被解析为下列值的表达式:yearquarterweekmonthdayhourminutesecondmillisecond|
|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" }
       <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原子星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值