文档菜单
文档首页
/
MongoDB 手册
/ / /

$dateFromParts (聚合)

本页内容

  • 定义
  • 行为
  • 示例
$dateFromParts

根据日期的组成部分构造并返回一个Date对象。

$dateFromParts表达式具有以下语法

{
$dateFromParts : {
'year': <year>, 'month': <month>, 'day': <day>,
'hour': <hour>, 'minute': <minute>, 'second': <second>,
'millisecond': <ms>, 'timezone': <tzExpression>
}
}

您还可以使用以下语法指定您的组成部分日期字段,格式如下

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

$dateFromParts接受以下字段的文档

重要

当构造您的$dateFromParts输入文档时,您不能同时使用日历日期和ISO周日期字段。

字段
必需/可选
描述
year
如果未使用isoWeekYear则必需

日历年份。可以是任何表达式,其计算结果为数字。

值范围:1-9999

如果指定的数字超出此范围,则 $dateFromParts 会出错。此值的下限为 1
isoWeekYear
如果未使用 year 则必须提供

ISO 周日期年。可以是任何计算结果为数字的 表达式

值范围:1-9999

如果指定的数字超出此范围,则 $dateFromParts 会出错。此值的下限为 1
month
可选。只能与 year 一起使用。

月份。可以是任何计算结果为数字的 表达式

默认为 1

值范围:1-12

如果指定的数字超出此范围,则 $dateFromParts 在日期计算中将包含差异。请参阅 值范围 以获取示例。
isoWeek
可选。只能与 isoWeekYear 一起使用。

年份中的周。可以是任何计算结果为数字的 表达式

默认为 1

值范围:1-53

如果指定的数字超出此范围,则 $dateFromParts 在日期计算中将包含差异。请参阅 值范围 以获取示例。
day
可选。只能与 year 一起使用。

月份中的日。可以是任何计算结果为数字的 表达式

默认为 1

值范围:1-31

如果指定的数字超出此范围,则 $dateFromParts 在日期计算中将包含差异。请参阅 值范围 以获取示例。
isoDayOfWeek
可选。只能与 isoWeekYear 一起使用。

星期中的日(周一 1 - 周日 7)。可以是任何计算结果为数字的 表达式

默认为 1

值范围:1-7

如果指定的数字超出此范围,则 $dateFromParts 在日期计算中将包含差异。请参阅 值范围 以获取示例。
hour
可选

小时。可以是任何计算结果为数字的 表达式

默认为 0

值范围:0-23

如果指定的数字超出此范围,则 $dateFromParts 在日期计算中将包含差异。请参阅 值范围 以获取示例。
minute
可选

分钟。可以是任何计算结果为数字的 表达式

默认为 0

值范围:0-59如果指定的数字超出此范围,则 $dateFromParts 在日期计算中将包含差异。请参阅 值范围 以获取示例。

second
可选

秒。可以是任何计算结果为数字的 表达式

默认为 0

值范围:0-59

如果指定的数字超出此范围,则 $dateFromParts 在日期计算中将包含差异。请参阅 值范围 以获取示例。
millisecond
可选

毫秒。可以是任何计算结果为数字的 表达式

默认为 0

值范围:0-999

如果指定的数字超出此范围,则 $dateFromParts 在日期计算中将包含差异。请参阅 值范围 以获取示例。
timezone
可选

<timezone> 可以是任何计算结果为字符串的 表达式,其值可以是

  • 一个Olson时区标识符,例如"Europe/London""America/New_York",或者

  • 以形式表示的UTC偏移量

    • +/-[hh]:[mm],例如"+04:45",或者

    • +/-[hh][mm],例如"-0530",或者

    • +/-[hh],例如"+03"

有关表达式的更多信息,请参阅表达式运算符。

yearisoWeekYear的支持值范围是1-9999

如果为除yearisoWeekYeartimezone之外的字段指定的值超出了有效范围,$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表达式,其中month字段值为0,比1个月的最小值少1个月

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

表达式通过将year减少1年并将month设置为12来计算日期

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

在使用Olson时区标识符作为<timezone>字段时,MongoDB将应用指定时区的DST偏移量(如果适用)DST偏移量

例如,考虑一个具有以下文档的 销售 集合

{
"_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")
}

返回

$dateDiff

本页内容