MongoDB聚合运算符:$dateFromParts

文章目录

语法

js 复制代码
{
    $dateFromParts : {
        'year': <year>, 'month': <month>, 'day': <day>,
        'hour': <hour>, 'minute': <minute>, 'second': <second>,
        'millisecond': <ms>, 'timezone': <tzExpression>
    }
}

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

js 复制代码
{
    $dateFromParts : {
        'isoWeekYear': <year>, 'isoWeek': <week>, 'isoDayOfWeek': <day>,
        'hour': <hour>, 'minute': <minute>, 'second': <second>,
        'millisecond': <ms>, 'timezone': <tzExpression>
    }
}

参数字段说明:

|字段|必须|说明|

|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|可选|执行操作的时区,<timezone>可以是任何能被解析为:Olson时区标识符或UTC偏移量|

使用

值域

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

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

值大于范围

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

js 复制代码
{ $dateFromParts: { 'year' : 2017, 'month' : 14, 'day': 1, 'hour' : 12  } }

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

js 复制代码
ISODate("2018-02-01T12:00:00Z")

值小于范围

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

js 复制代码
{ $dateFromParts: { 'year' : 2017, 'month' : 0, 'day': 1, 'hour' : 12  } }

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

js 复制代码
ISODate("2016-12-01T12:00:00Z")

时区

<timezone>字段中使用Olson时区标识符时,MongoDB会应用 DST 偏移(如果适用于指定的时区)。

例如下面的sales集合:

json 复制代码
{
   "_id" : 1,
   "item" : "abc",
   "price" : 20,
   "quantity" : 5,
   "date" : ISODate("2017-05-20T10:24:51.303Z")
}

下面的聚合说明了 MongoDB 如何处理 Olson 时区标识符的 DST 偏移量。示例使用$hour$minute操作符返回日期字段的相应部分:

js 复制代码
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" }
       }
   }
}])

操作返回以下结果:

json 复制代码
{
   "_id": 1,
   "nycHour" : 5,
   "nycMinute" : 24,
   "gmtHour" : 10,
   "gmtMinute" : 24,
   "nycOlsonHour" : 6,
   "nycOlsonMinute" : 24
}

举例

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

js 复制代码
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'
         }
      }
   }
}])

操作返回以下结果:

json 复制代码
{
  "_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")
}
相关推荐
火山上的企鹅4 小时前
Codex实战:APP远程升级服务搭建(三)后台管理页面(APK 上传、版本管理、多应用页签)
服务器·网络·数据库·oracle·qgc
阿狸猿5 小时前
论 NoSQL 数据库技术及其应用
数据库·nosql
FBI HackerHarry浩5 小时前
DataGrip2023.2.3默认保存的数据库和.sql文件在哪里?怎么修改默认路径?
数据库
袁小皮皮不皮5 小时前
3.HCIP OSPF补充知识(优化版)
服务器·网络·数据库·网络协议·智能路由器
运筹vivo@5 小时前
Python ContextVar 底层机制与内存模型拆解
前端·数据库·python
志栋智能6 小时前
超自动化巡检:知识沉淀与团队协作的新载体
大数据·运维·网络·数据库·人工智能·自动化
syt_biancheng6 小时前
Redis初识
数据库·redis·缓存
cmes_love6 小时前
股票逐笔level2历史行情下载十档订单薄五档tick分钟下载分享
数据库·区块链
仙俊红6 小时前
SQL 调优需要掌握的知识
数据库·sql
fofantasy7 小时前
NSK LH12AN 微型导轨技术手册
运维·网络·数据库·经验分享·规格说明书