mongo - 日期类型

原文地址:http://www.cnblogs.com/yuechaotian/archive/2012/11/02/2751478.html

(一)

mongo中的日期类型,使用ISO格式,例如:ISODate("2012-11-02T07:58:51.718Z")。下面来测试一下: 

 C:\>mongo 127.0.0.1:2222/test

MongoDB shell version: 1.8.3
connecting to: 127.0.0.1:2222/test
type "help" for help

 

neu:PRIMARY> db.t2.insert({mydate:ISODate("2012-11-02T07:58:51.718Z")})

neu:PRIMARY> db.t2.find()
{ "_id" : ObjectId("50937ded0847cf5f01606dae"), "mydate" : ISODate("2012-11-02T07:58:51.718Z") }

日期字符串也支持多种格式

neu:PRIMARY> db.t2.insert({mydate:ISODate("2012-11-02 07:58:51")})

neu:PRIMARY> db.t2.insert({mydate:ISODate("20121102 07:58:51")})

neu:PRIMARY> db.t2.insert({mydate:ISODate("20121102")}) 

neu:PRIMARY> db.t2.find()
{ "_id" : ObjectId("50937ded0847cf5f01606dae"), "mydate" : ISODate("2012-11-02T07:58:51.718Z") }
{ "_id" : ObjectId("509380d22bb20f9946fb9004"), "mydate" : ISODate("2012-11-02T07:58:51Z") }
{ "_id" : ObjectId("509381052bb20f9946fb9005"), "mydate" : ISODate("2012-11-02T07:58:51Z") }
{ "_id" : ObjectId("509381102bb20f9946fb9006"), "mydate" : ISODate("2012-11-02T00:00:00Z") }

 

我们比较一下mongo中的当前时间与系统当前时间:

 
neu:PRIMARY> new Date()
ISODate("2012-11-02T 08:13:10.250Z")
neu:PRIMARY> ^Z
bye
 
C:\>date
当前日期: 2012-11-02 星期五
输入新日期: (年月日)
 
C:\>time
当前时间: 16:13:14.95
输入新时间:

 

我们看到,mongo中的时间似乎与系统时间相差了8个小时,why?

这是因为mongo中的date类型以UTC(Coordinated Universal Time)存储,就等于GMT(格林尼治标准时)时间。而系统时间使用的是GMT+0800时间,两者正好相差8个小时。

 

在mongodb与oracle或sqlserver相互同步数据时,需要注意这一点!

 

如果用python直接读取mongo中的日期,就会发生错误:

>>> import pymongo
>>> conn=pymongo.Connection('127.0.0.1',2222)
>>> db=conn.test
>>> for row in db.t2.find():
...     print row['mydate']
...
2012-11-02 07:58:51.718000
2012-11-02 07:58:51
2012-11-02 07:58:51
2012-11-02 00:00:00

2012-11-02 00:00:00 

 

在python中,与之对应的日期是 datetime.datetime.utcnow(),而不是now(),两者正好差8个小时:

>>> import datetime 

 >>> datetime.datetime.utcnow()

datetime.datetime(2012, 11, 2,  8, 22, 52, 953000)
>>> datetime.datetime.now()

datetime.datetime(2012, 11, 2, 16, 22, 58, 218000) 

 

关于二者的转换,可以参考这个链接: http://www.linuxso.com/linuxbiancheng/12653.html


(二)

当通过mongo shell来插入日期类型数据时,使用new Date()和使用Date()是不一样的:

> db.tianyc04.insert({mark:1, mark_time:new Date()})
> db.tianyc04.insert({mark:2, mark_time:Date()})
> db.tianyc04.find()

{ "_id" : ObjectId("5126e00939899c4cf3805f9b"), "mark" : 1, "mark_time" : ISODate("2013-02-22T03:03:37.312Z") }
{ "_id" : ObjectId("5126e00c39899c4cf3805f9c"), "mark" : 2, "mark_time" : "Fri Feb 22 2013 11:03:40 GMT+0800" }

>

我们看:使用new Date(),插入的是一个isodate类型;而使用Date()插入的是一个字符串类型。

那isodate是什么日期类型的?我们看这2个值,它比字符串大概少了8小时。这是由于mongo中的date类型以UTC(Coordinated Universal Time)存储,就等于GMT(格林尼治标准时)时间。而我当前所处的是+8区,所以mongo shell会将当前的GMT+0800时间减去8,存储成GMT时间。

如果通过get函数来获取,那么mongo会自动转换成当前时区的时间:

> db.tianyc04.findOne({mark:1})
{
"_id" : ObjectId("5126e00939899c4cf3805f9b"),
"mark" : 1,
"mark_time" : ISODate("2013-02-22T03:03:37.312Z")
}
> db.tianyc04.findOne({mark:1}).mark_time
ISODate("2013-02-22T03:03:37.312Z")
> x=db.tianyc04.findOne({mark:1}).mark_time
ISODate("2013-02-22T03:03:37.312Z")
> x
ISODate("2013-02-22T03:03:37.312Z")
> x.getFullYear()
2013
> x.getMonth() # js中的月份是从0开始的(0-11)
1
> x.getMonth()+1
2
> x.getDate()
22
> x.getHours() #注意这里获取到的小时是11,而不是3
11
> x.getMinutes()
3
> x.getSeconds()
37

ISO的日期类型可以直接使用new Date来进行比较,直接使用+8后的时间即可(注意字符串使用“/”分隔符):

> db.tianyc04.find({mark_time:{$gt: new Date('2013/02/22 11:03:37')}})
{ "_id" : ObjectId("5126e00939899c4cf3805f9b"), "mark" : 1, "mark_time" : ISODate("2013-02-22T03:03:37.312Z") }
> db.tianyc04.find({mark_time:{$lt: new Date('2013/02/22 11:03:37')}})
> db.tianyc04.find({mark_time:{$lt: new Date('2013/02/22 11:03:38')}})
{ "_id" : ObjectId("5126e00939899c4cf3805f9b"), "mark" : 1, "mark_time" : ISODate("2013-02-22T03:03:37.312Z") }
> db.tianyc04.find({mark_time:{$gt: new Date('2013/02/22 11:03:37'), $lt: new Date('2013/02/22 11:03:38')}})
{ "_id" : ObjectId("5126e00939899c4cf3805f9b"), "mark" : 1, "mark_time" : ISODate("2013-02-22T03:03:37.312Z") }


 

那么,如果使用python来读取isodate类型的数据,会自动转化为GMT+0800时间吗?我继续测试:

> exit
bye

C:\>python
'import site' failed; use -v for traceback
Python 2.6.2 (r262:71605, Apr 14 2009, 22:40:02) [MSC v.1500 32 bit (Int
Type "help", "copyright", "credits" or "license" for more information.
>>> import pymongo
>>> conn=pymongo.Connection('10.0.0.35',20000)
>>> db=conn.test
>>> tianyc04=db.tianyc04.find()
#我们看,从python取出来的也是一个日期类型,一个字符串类型
>>> print tianyc04[0]
{u'mark_time': datetime.datetime(2013, 2, 2, 1, 52, 12, 281000), u'_id': ObjectId('510c714c045d7d8d7b6ec1bb'), u'mark': 1.0}
>>> print tianyc04[1]
{u'mark_time': u'Sat Feb 02 2013 09:52:17 GMT+0800', u'_id': ObjectId('510c7151045d7d8d7b6ec1bc'), u'mark': 1.0}
#我打印出mongo的isodate类型,发现并没有自动转换为GMT+0800时间:
>>> print tianyc04[0]['mark_time']
2013-02-02 01:52:12.281000
>>> print tianyc04[1]['mark_time']
Sat Feb 02 2013 09:52:17 GMT+0800


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Spring Data MongoDB中,MongoTemplate提供了多种日期查询方式,以下是一些常用的方式: 1. 等于某个日期:可以使用Criteria.where和is操作符,例如: ``` Query query = new Query(); query.addCriteria(Criteria.where("date").is(new Date("2022-01-01"))); List<MyDocument> results = mongoTemplate.find(query, MyDocument.class); ``` 2. 大于某个日期:可以使用Criteria.where和gt操作符,例如: ``` Query query = new Query(); query.addCriteria(Criteria.where("date").gt(new Date("2022-01-01"))); List<MyDocument> results = mongoTemplate.find(query, MyDocument.class); ``` 3. 小于某个日期:可以使用Criteria.where和lt操作符,例如: ``` Query query = new Query(); query.addCriteria(Criteria.where("date").lt(new Date("2022-01-01"))); List<MyDocument> results = mongoTemplate.find(query, MyDocument.class); ``` 4. 范围查询:可以使用Criteria.where、gte和lte操作符,例如: ``` Query query = new Query(); query.addCriteria(Criteria.where("date").gte(new Date("2022-01-01")).lte(new Date("2022-01-31"))); List<MyDocument> results = mongoTemplate.find(query, MyDocument.class); ``` 5. 某一年/月/日查询:可以使用Criteria.where和andOperator操作符,例如: ``` Query query = new Query(); query.addCriteria(Criteria.where("date").andOperator( Criteria.where("year").is(2022), Criteria.where("month").is(1), Criteria.where("day").is(1) )); List<MyDocument> results = mongoTemplate.find(query, MyDocument.class); ``` 注意,上述日期格式均为Java Date,如果需要使用其他格式,需要先将其转为Java Date。 ### 回答2: MongoTemplate是Spring Data MongoDB的核心类之一,可以进行与MongoDB数据库的交互。当需要使用MongoTemplate进行日期查询时,可以通过使用Criteria对象或Query对象来实现。 一种常用的方法是使用Criteria对象。可以调用Criteria的方法来构建查询条件,如eq(等于)、ne(不等于)、lt(小于)、gt(大于)、lte(小于等于)、gte(大于等于)等。对于日期查询,可以使用以下方法: 1. eq(等于):使用Criteria.where("字段名").is(日期对象)。 例子:criteria.where("createDate").is(new Date()); 2. ne(不等于):使用Criteria.where("字段名").ne(日期对象)。 例子:criteria.where("createDate").ne(new Date()); 3. lt(小于):使用Criteria.where("字段名").lt(日期对象)。 例子:criteria.where("createDate").lt(new Date()); 4. gt(大于):使用Criteria.where("字段名").gt(日期对象)。 例子:criteria.where("createDate").gt(new Date()); 5. lte(小于等于):使用Criteria.where("字段名").lte(日期对象)。 例子:criteria.where("createDate").lte(new Date()); 6. gte(大于等于):使用Criteria.where("字段名").gte(日期对象)。 例子:criteria.where("createDate").gte(new Date()); 另外一种方法是使用Query对象。可以通过设置Query对象的Criteria属性来进行日期查询,如query.addCriteria(criteria)。然后使用MongoTemplate的find()方法执行查询操作,如mongoTemplate.find(query, 类.class)。 总结:对于日期查询,可以使用Criteria对象或Query对象来构建查询条件,然后通过MongoTemplate的find()方法执行查询操作。根据具体需要,可以使用eq、ne、lt、gt、lte、gte等方法来进行等于、不等于、小于、大于、小于等于、大于等于的日期查询。 ### 回答3: MongoTemplate是Spring Data MongoDB提供的操作MongoDB数据库的工具,可以实现与数据库的交互。使用MongoTemplate进行日期查询,可以通过以下几种方式实现: 1. 使用BasicQuery查询: 首先,我们需要使用BasicQuery对象创建查询条件。通过BasicQuery可以使用MongoDB的查询语法进行日期查询。 比如,我们想查询创建时间在某个时间段内的文档,可以使用下面的代码: ``` DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime startTime = LocalDateTime.parse("2022-01-01 00:00:00", formatter); LocalDateTime endTime = LocalDateTime.parse("2022-12-31 23:59:59", formatter); Criteria criteria = Criteria.where("createTime").gte(startTime).lte(endTime); Query query = new BasicQuery(criteria); List<Document> documents = mongoTemplate.find(query, Document.class, "collectionName"); ``` 2. 使用@Query注解查询: 另一种方式是使用@Query注解进行日期查询。在自定义的查询方法上使用@Query注解,可以编写MongoDB的查询语句。 比如,我们想查询某个日期之后创建的文档,可以使用下面的代码: ```java @Query("{'createTime': {$gte: ?0}}") List<Document> findByCreateTimeAfter(LocalDateTime createTime); ``` 然后在调用该方法即可获取结果: ```java List<Document> documents = mongoTemplate.findByCreateTimeAfter(LocalDateTime.parse("2022-01-01 00:00:00")); ``` 通过以上两种方式,我们可以使用MongoTemplate对MongoDB中的日期字段进行查询操作,根据具体需求选择合适的方式即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值