日期表达式运算符主要用于实现日期运算,主要包括了转换成日期、获取日期的年月日时分秒等操作

一、准备数据

初始化日期数据

db.persons.insertMany([
    { "_id": "1", "name": "张三", "birth": "1998-10-20 12:00:00.235" },
    { "_id": "2", "name": "李四", "birth": "1993-08-16 20:08:20.890" }
])

二、字符串转日期($toDate)

语法:{ $toDate: <expression> }

将表达式的结果转换成日期

4.0及以后版本可用

例子:转换人员的出生日期

db.persons.aggregate([
    {
        $project: {
            "name": 1,
            "birth": { $toDate: "$birth" }
        }
    }
])

 聚合查询的结果如下:

{ "_id" : "1", "name" : "张三", "birth" : ISODate("1998-10-20T12:00:00.235Z") }
{ "_id" : "2", "name" : "李四", "birth" : ISODate("1993-08-16T20:08:20.890Z") }

三、字符串转日期($dateFromString)

语法:

{ 
    $dateFromString: {
        dateString: <dateStringExpression>,
        format: <formatStringExpression>,
        timezone: <tzExpression>,
        onError: <onErrorExpression>,
        onNull: <onNullExpression>
    } 
}

 其中,

        dateString: <dateStringExpression>:代表的是需要转换成日期的字符串表达式

        format: <formatStringExpression>:可选,代表的是转换格式表达式

                默认使用:"%Y-%m-%dT%H:%M:%S.%LZ"

        timezone: <tzExpression>:可选,代表的是转换成日期时使用的时区的表达式

        onError: <onErrorExpression>:可选,代表的是转换失败时的处理方式的表达式

        onNull: <onNullExpression>:可选,代表的是Null的情况下的处理方式的表达式

例子:转换人员的出生日期

db.persons.aggregate([
    {
        $project: {
            "name": 1,
            "birth": { 
                $dateFromString: {
                    dateString: "$birth"
                } 
            }
        }
    }
])

聚合查询的结果如下:

{ "_id" : "1", "name" : "张三", "birth" : ISODate("1998-10-20T12:00:00.235Z") }
{ "_id" : "2", "name" : "李四", "birth" : ISODate("1993-08-16T20:08:20.890Z") }

 例子:转换人员的出生日期

db.persons.aggregate([
    {
        $project: {
            "name": 1,
            "birth": { 
                $dateFromString: {
                    dateString: "$birth",
                    format: "%Y-%m-%d %H:%M:%S.%L"
                } 
            }
        }
    }
])

聚合查询的结果如下:

{ "_id" : "1", "name" : "张三", "birth" : ISODate("1998-10-20T12:00:00.235Z") }
{ "_id" : "2", "name" : "李四", "birth" : ISODate("1993-08-16T20:08:20.890Z") }

具体的格式说明如下:

定义

描述

值范围

%d

第几天,2位,不够2位用0补充,指的是某月中的第几天

01-31

%H

小时,2位,不够2位用0补充,24小时制

00-23

%L

毫秒,3位,不够3位用0补充

000-999

%m

月,2位,不够2位用0补充

01-12

%M

分钟,2位,不够2位用0补充

00-59

%S

秒,2位,不够2位用0补充

00-60

%Y

年,4位,不够4位用0补充

0000-9999

四、日期转字符串($dateToString)

语法:

{
    $dateToString: {
        date: <dateExpression>,
        format: <formatString>,
        timezone: <tzExpression>,
        onNull: <expression>
    } 
}

其中,

        date: <dateExpression>:代表的是需要转换成字符串的日期表达式

        format: <formatString>:可选,代表的是转换格式字符串

                默认使用:"%Y-%m-%dT%H:%M:%S.%LZ"

        timezone: <tzExpression>:可选,代表的是转换成日期时使用的时区的表达式

        onNull: <expression>:可选,代表的是Null的情况下的处理方式的表达式

 例子:转换人员的出生日期(只保留年月日)

db.persons.aggregate([
    {
        $project: {
            "name": 1,
            "birth": {
                $dateToString: {
                    date: {
                        $dateFromString: {
                            dateString: "$birth",
                            format: "%Y-%m-%d %H:%M:%S.%L"
                        }
                    },
                    format: "%Y/%m/%d"
                } 
            }
        }
    }
])

我们对上面的聚合查询进行解释:

(1)使用dateFormString将birth转换成日期类型 

(2)使用dateToString将日期类型再转换成字符串类型,转换过程中使用format完成格式化

聚合查询的结果如下:

{ "_id" : "1", "name" : "张三", "birth" : "1998/10/20" }
{ "_id" : "2", "name" : "李四", "birth" : "1993/08/16" }

五、获取年、月、时、分、秒、毫秒

语法:

        获取年:{ $year: <dateExpression> }

        获取月:{ $month: <dateExpression> }

        获取周:{ $week: <dateExpression> }

        获取时:{ $hour: <dateExpression> }

        获取分:{ $minute: <dateExpression> }

        获取秒:{ $second: <dateExpression> }

        获取毫秒:{ $millisecond: <dateExpression> }

例子:获取出生日期的年月周、时分秒毫秒

db.persons.aggregate([
    {
        $project: {
            "name": 1,
            "birth": { $toDate: "$birth" },
            "year": { $year: { $toDate: "$birth" } },
            "month": { $month: { $toDate: "$birth" } },
            "week": { $week: { $toDate: "$birth" } },
            "hour": { $hour: { $toDate: "$birth" } },
            "minute": { $minute: { $toDate: "$birth" } },
            "second": { $second: { $toDate: "$birth" } },
            "millisecond": { $millisecond: { $toDate: "$birth" } }
        }
    }
])

聚合查询的结果如下:

{
	"_id" : "1",
	"name" : "张三",
	"birth" : ISODate("1998-10-20T12:00:00.235Z"),
	"year" : 1998,
	"month" : 10,
	"week" : 42,
	"hour" : 12,
	"minute" : 0,
	"second" : 0,
	"millisecond" : 235
}
{
	"_id" : "2",
	"name" : "李四",
	"birth" : ISODate("1993-08-16T20:08:20.890Z"),
	"year" : 1993,
	"month" : 8,
	"week" : 33,
	"hour" : 20,
	"minute" : 8,
	"second" : 20,
	"millisecond" : 890
}

六、获取年的第几天、月的第几天、周的第几天

语法:

        获取年的第几天:{ $dayOfYear: <dateExpression> }

        获取月的第几天:{ $dayOfMonth: <dateExpression> }

        获取周的第几天:{ $dayOfWeek: <dateExpression> }

例子:获取年的第几天、月的第几天、周的第几天

db.persons.aggregate([
    {
        $project: {
            "name": 1,
            "dayOfYear": { $dayOfYear: { $toDate: "$birth" } },
            "dayOfMonth": { $dayOfMonth: { $toDate: "$birth" } },
            "dayOfWeek": { $dayOfWeek: { $toDate: "$birth" } }
        }
    }
])

 聚合查询的结果如下:

{
	"_id" : "1",
	"name" : "张三",
	"dayOfYear" : 293,
	"dayOfMonth" : 20,
	"dayOfWeek" : 3
}
{
	"_id" : "2",
	"name" : "李四",
	"dayOfYear" : 228,
	"dayOfMonth" : 16,
	"dayOfWeek" : 2
}