GAE数据库对时间属性的精确查询

标签:Google App Engine, Python

考虑一个聊天室的消息模型,一般会有如下属性
class Message(db.Model):
  author = db.UserProperty(auto_current_user_add=True)
  content = db.StringProperty(multiline=True)
  time = db.DateTimeProperty(auto_now_add=True)
为了省事,我不想去维护一个ID字段,只想对time字段排序,并查询出比最近一次查询结果的时间更晚的消息。

而在数据库中,time字段是精确到微秒的,例如:2009-02-12 01:59:16.153179。
要想找出晚于它的实体,用GQL是没法做到的,因为GQL的时间只能精确到秒。
所以只能使用更精确的方法:
time = datetime(2009,2,12,1,59,16,153179)
Message.all().filter('time =', time).get()
Message.all().filter('time >', time).order('-time').fetch(1000)
这种方法工作良好,但微秒部分不能有误差,相差1微秒也不行。

但是在时间转换的时候却会造成误差,例如timetuple()会丢失微秒部分,time.mktime也只精确到秒,JavaScript的Date.parse()也会丢失毫秒部分。
目前我能想到的办法是生成timestamp,然后将microsecond除以1百万,与timestamp相加。需要解析时,再将整数和小数部分分离即可。虽然浮点数会有误差,但datetime和JavaScript的Date构造函数都会四舍五入到整数,所以仍可精确匹配。

0条评论 你不来一发么↓

    想说点什么呢?