MongoDB聚合运算符:$dateFromParts

小明 2025-05-05 11:35:04 7

文章目录

    • 语法
    • 使用
      • 值域
      • 值大于范围
      • 值小于范围
      • 时区
      • ��例

        语法

        {
            $dateFromParts : {
                'year': , 'month': , 'day': ,
                'hour': , 'minute': , 'second': ,
                'millisecond': , 'timezone': 
            }
        }
        

        也可以用以下格式指定组成日期字段ISO周日期格式指定日期字段:

        ()
        {
            $dateFromParts : {
                'isoWeekYear': , 'isoWeek': , 'isoDayOfWeek': ,
                'hour': , 'minute': , 'second': ,
                'millisecond': , 'timezone': 
            }
        }
        

        参数字段说明:

        字段必须说明
        year如果没有用isoWeekYear则必须日历年度,可以是任何能解析为整数的表达式,值域为:1~9999,如果超出范围将报错。从4.4以后最小值为1,再之前的版本最小值是0
        isoWeekYear若year没有用则必须ISO的周日期年,可以是任何能解析为整数的表达式,值域为:1~9999,如果超出将报错。从4.4以后最小值为1,再之前的版本最小值是0
        month可选,只能与year同时使用月份,可以是任何能解析为整数的表达式,缺省值为1,值域:1~12,如果超出范围则将差值纳入日期计算
        isoWeek可选,只能与isoWeekYear同时使用周数,可以是任何能解析为整数的表达式,缺省值为1,值域:1~53,如果超出返回则将差值纳入日期计算
        day可选,只能与year同时使用日,可以是任何能解析为整数的表达式,缺省值为1,值域:1~31,如果超出范围则将差值纳入日期计算
        isoDayWeek可选,只能与isoWeekYear同时使用星期几(Monday 1~Sunday 7),可以是任何能解析为整数的表达式,值域:1~7,如果超出范围,则将差值纳入日期计算
        hour可选小时,可以是任何能解析为数值的表达式,缺省值为0,值域:0~23,如果超出范围,则将差值纳入日期计算
        minute可选分钟,可以是任何能解析为数值的表达式,缺省值为0,值域:0~59,如果超出范围,则将差值纳入日期计算
        second可选秒,可以是任何能解析为数值的表达式,缺省值为0,值域:0~59,如果超出范围,则将差值纳入日期计算
        millisecond可选毫秒,可以是任何能解析为数值的表达式,缺省值为0,值域:0~999,如果超出范围,则将差值纳入日期计算
        timezone可选执行操作的时区,可以是任何能被解析为:Olson时区标识符或UTC偏移量

        使用

        值域

        从MongoDB4.4开始,year和isoWeekYear的支持值范围为1-在MongoDB以前的版本中,这些值的下限是0,支持的值范围是0-

        ()

        如果为year、isoWeekYear和timezone以外的字段指定的值超出了有效范围,$dateFromParts就会从其他日期部分转入或减去差值来计算日期。

        值大于范围

        如下面的$dateFromParts表达式,其中month字段值为 14,比最大值 12 个月(或 1 年)多 2 个月:

        { $dateFromParts: { 'year' : 2017, 'month' : 14, 'day': 1, 'hour' : 12  } }
        

        该表达式通过将year增加 1 并将month设置为 2 来计算日期:

        ISODate("2018-02-01T12:00:00Z")
        

        值小于范围

        如下面的$dateFromParts表达式,其中月份字段值为 0,比最小值 1 个月少 1 个月:

        { $dateFromParts: { 'year' : 2017, 'month' : 0, 'day': 1, 'hour' : 12  } }
        

        该表达式计算日期时,将year减 1,month设为 12,然后返回日期:

        ISODate("2016-12-01T12:00:00Z")
        

        时区

        在字段中使用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" }
               }
           }
        }])
        

        操作返回以下结果:

        {
           "_id": 1,
           "nycHour" : 5,
           "nycMinute" : 24,
           "gmtHour" : 10,
           "gmtMinute" : 24,
           "nycOlsonHour" : 6,
           "nycOlsonMinute" : 24
        }
        

        举例

        下面的汇总使用$dateFromParts从提供的输入字段构建三个日期对象:

        db.sales.aggregate([
        {
           $project: {
              date: {
                 $dateFromParts: {
                    'year' : 2017, 'month' : 2, 'day': 8, 'hour' : 12
                 }
              },
              date_iso: {
                 $dateFromParts: {
                    'isoWeekYear' : 2017, 'isoWeek' : 6, 'isoDayOfWeek' : 3, 'hour' : 12
                 }
              },
              date_timezone: {
                 $dateFromParts: {
                    'year' : 2016, 'month' : 12, 'day' : 31, 'hour' : 23,
                    'minute' : 46, 'second' : 12, 'timezone' : 'America/New_York'
                 }
              }
           }
        }])
        

        操作返回以下结果:

        {
          "_id" : 1,
          "date" : ISODate("2017-02-08T12:00:00Z"),
          "date_iso" : ISODate("2017-02-08T12:00:00Z"),
          "date_timezone" : ISODate("2017-01-01T04:46:12Z")
        }
        
The End
微信