文章目录
语法
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开始,year
和isoWeekYear
的支持值范围为1-9999
。在MongoDB以前的版本中,这些值的下限是0
,支持的值范围是0-9999
。
如果为year
、isoWeekYear
和timezone
以外的字段指定的值超出了有效范围,$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")
}