在Google App Engine的Datastore中按日期过滤
我在尝试根据日期过滤一组对象时遇到了一些问题。目前,我可以这样获取用户的所有交易记录:
> t = Transaction.all().filter("client_email =", "some_email").filter("application_id =", "foo").fetch(100)
> len(t)
# => 4
现在,如果我想设置一些日期过滤条件:
> min = datetime.datetime(2009, 2, 3, 0, 0)
> max = datetime.datetime(2009, 11, 4, 0, 0)
> len(Transaction.gql("WHERE client_email =:1 AND date >:2 AND date <=:3 AND application_id =:4",
"some_email", min, max, "foo").fetch(100))
# => 2
我知道所有这些交易的日期都在最大值和最小值之间:
> map(lambda x: x.date, t)
# => [datetime.datetime(2009, 10, 2, 22, 43, 51), datetime.datetime(2009, 10, 5, 2, 5, 24), datetime.datetime(2009, 10, 7, 16, 51, 5), datetime.datetime(2009, 10, 7, 16, 6, 53)]
没错,所有这些交易都是在2009年10月进行的。我在Python中进行了过滤,以确认这些日期是正确的:
> trans = filter(lambda x: x.date < max and x.date >= min, t)
> len(trans)
# => 4
所以,是的,它们的日期都是正确的,但由于我的查询中出现了一些问题,结果和预期的不一致,你知道查询中可能出了什么问题吗?
1 个回答
1
你有没有试过让查询的日期信息符合App Engine GQL语法呢?比如说,语法是这样的:
DATETIME(year, month, day, hour, minute, second)
DATETIME('YYYY-MM-DD HH:MM:SS')
DATE(year, month, day)
DATE('YYYY-MM-DD')
TIME(hour, minute, second)
TIME('HH:MM:SS')
试着运行下面的GQL:
"WHERE client_email =:1 AND date > DATE(:2) AND date <= DATE(:3) AND application_id =:4", "some_email", "2009-02-03", "2009-11-04", "foo"