MongoDB中的日期查询的坑

在熟悉monggoDB的时候遇到了时间查询的问题代码如下:

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import com.mongodb.ServerAddress;

/**
 * mongo 数据库直连测试
 * @author fuhao
 *
 */
public class MongDBTest {
	public static void main(String[] args) throws Exception {
		List<ServerAddress> list = new ArrayList<ServerAddress>();
//		连接数据库   ip 端口
		list.add(new ServerAddress("10.39.XXX.XXX", 27010));
		MongoClient mongoClient = new MongoClient(list);
		//数据库名称
	    DB psdoc = mongoClient.getDB("qa_db_center");
	    //表明
	    DBCollection collection=psdoc.getCollection("base_user_info");
	    
	    BasicDBObject queryObject = null; 
	    
	    // 时间查询    数据库看到的时间不是真实时间  加8小时后才是正确的时间
	    DBObject dbObject = new BasicDBObject();
	    String startDate = "2018-03-29 15:59:06";
	    String endDate = "2018-03-29 16:30:46";
	    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	    dbObject.put("$gte", sdf.parse(startDate));
	    dbObject.put("$lte",  sdf.parse(endDate));
	    queryObject = new BasicDBObject();
	    queryObject.put("create_time",dbObject);
	    DBCursor find = collection.find(queryObject);
	     
	    while (find.hasNext()) {
	    	 DBObject next = find.next();
	    	 Object real_name = next.get("real_name");
	    	 Object mobile = next.get("mobile");
	    	 Object create_time = next.get("create_time"); 
	    	 String str = sdf.format(create_time);
	    	 System.out.println(real_name +"====="+mobile +"====="+str);
		}
	     System.out.println("结束");
	    
	    
	}
}

上面的代码中查询时间 按mysql 的流程应该查询到 2018-03-29 15:59:06 到2018-03-29 16:30:46 这个区间的数据,但是mongoDB不同,因为mongo中的date类型以UTC(Coordinated Universal Time)存储,就等于GMT(格林尼治标准时)时间。而系统时间使用的是GMT+0800时间,两者正好相差8个小时。也就是用java 代码插入的时间类型的值都会被减8小时。这个坑挺大的不注意很容易出事。

展示一下对比数据便于理解:

上面的圈是查询的条件对应数据库中的数据是2018-03-29T08:30:36.310Z 如下图,但是在java中你写2018-03-29 08:30:36这个时间肯定查不到数据

 

对比得出数据库中看到的时间和实际时间差8小时,但是查询出来的结果时间还是会被转换回来(不以时间为条件查询的话基本没什么问题)。

记录一下mongoDB中查询区间时间的执行语句:

db.getCollection('base_user_info').find({"create_time":{"$gte":ISODate("2018-03-29 07:59:06"),"$lte":ISODate("2018-03-29 08:30:46")}});

base_user_info :表名  create_time:字段名

比较符号对应列表

$gt -------- greater than  >

$gte --------- gt equal  >=

$lt -------- less than  <

$lte --------- lt equal  <=

$ne ----------- not equal  !=

$eq  --------  equal  =

 

参考资料:https://blog.csdn.net/y1yo2/article/details/77320165  看到这个我才想通为什么我查8点半为什么查不到数据。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值