Google DataStore - 如何按日期获取数据
Google DataStore - how to fetch data by date
我正在尝试为 DataStore 编写提取查询。
在数据存储中,它具有格式为 2018-02-20 (11:07:36.000) MMT
的日期字段列
我只想获取指定日期的数据
我正在执行以下操作,但它不起作用:
def query(self, date=None):
query = self.client.query(kind='Test')
if date != None:
query.add_filter('date', '>', datetime.strptime(date, '%Y%m%d').strftime('%Y-%m-%d'))
query.add_filter('date', '<', datetime.strptime(date, '%Y%m%d').strftime('%Y-%m-%d'))
results = list(query.fetch())
print(results)
return results
if __name__ == '__main__':
date = 20181012
data_list = query(date)
我做错了什么?
旁注:您的 date
是一个整数,将它传递给 datetime.strptime(date, '%Y%m%d')
是行不通的,您会得到一个 TypeError: strptime() argument 1 must be string, not int
。您需要使用字符串,而不是 int。但这不是真正的问题。
In datastore it has date field column with this format 2018-02-20
(11:07:36.000) MMT
格式无关紧要,您不应将时间戳属性作为字符串进行操作。换句话说,您不需要使用 strftime/strptime
。您应该将它们作为 datetime
对象来处理。您可以在 Restrictions on queries:
中找到示例
start_date = datetime.datetime(1990, 1, 1)
end_date = datetime.datetime(2000, 1, 1)
query = client.query(kind='Task')
query.add_filter(
'created', '>', start_date)
query.add_filter(
'created', '<', end_date)
另一个重要的注意事项是您添加了过滤器的查询永远不会产生任何结果:没有 'date'
属性 值可以同时大于和小于 相同 其他值 - 您的 datetime.strptime(date, '%Y%m%d').strftime('%Y-%m-%d')
,存在于两个过滤器中。您需要在 2 个过滤器中提供 2 不同 开始和结束时间戳值。
根据你的问题调整上面的例子,它会是这样的:
query.add_filter('date', '>=', date)
query.add_filter('date', '<', date + datetime.timedelta(days=1))
然后您将 'date'
指定为 datetime
:
date = datetime.datetime(2018, 10, 12)
这是在 JAVA 运行时通过 GAE 中的 JDO 查询进行日期相等性过滤的一种方法:
public List<User> findByOrganizationIdAndDOB(Long organizationID, Date dateOfBirth) {
PersistenceManager pm = PMF.get().getPersistenceManager();
List<User> userList = null;
try {
Query q = pm.newQuery(User.class);
q.declareImports("import java.util.Date");
q.setFilter("organizationId ==organizationID && dateOfBirth==dateOfBirthParam");
q.declareParameters("Long organizationID, Date dateOfBirthParam");
userList = (List<User>) q.execute(organizationID,dateOfBirth);
return userList;
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
pm.close();
}
}
我正在尝试为 DataStore 编写提取查询。
在数据存储中,它具有格式为 2018-02-20 (11:07:36.000) MMT
的日期字段列我只想获取指定日期的数据
我正在执行以下操作,但它不起作用:
def query(self, date=None):
query = self.client.query(kind='Test')
if date != None:
query.add_filter('date', '>', datetime.strptime(date, '%Y%m%d').strftime('%Y-%m-%d'))
query.add_filter('date', '<', datetime.strptime(date, '%Y%m%d').strftime('%Y-%m-%d'))
results = list(query.fetch())
print(results)
return results
if __name__ == '__main__':
date = 20181012
data_list = query(date)
我做错了什么?
旁注:您的 date
是一个整数,将它传递给 datetime.strptime(date, '%Y%m%d')
是行不通的,您会得到一个 TypeError: strptime() argument 1 must be string, not int
。您需要使用字符串,而不是 int。但这不是真正的问题。
In datastore it has date field column with this format 2018-02-20 (11:07:36.000) MMT
格式无关紧要,您不应将时间戳属性作为字符串进行操作。换句话说,您不需要使用 strftime/strptime
。您应该将它们作为 datetime
对象来处理。您可以在 Restrictions on queries:
start_date = datetime.datetime(1990, 1, 1) end_date = datetime.datetime(2000, 1, 1) query = client.query(kind='Task') query.add_filter( 'created', '>', start_date) query.add_filter( 'created', '<', end_date)
另一个重要的注意事项是您添加了过滤器的查询永远不会产生任何结果:没有 'date'
属性 值可以同时大于和小于 相同 其他值 - 您的 datetime.strptime(date, '%Y%m%d').strftime('%Y-%m-%d')
,存在于两个过滤器中。您需要在 2 个过滤器中提供 2 不同 开始和结束时间戳值。
根据你的问题调整上面的例子,它会是这样的:
query.add_filter('date', '>=', date)
query.add_filter('date', '<', date + datetime.timedelta(days=1))
然后您将 'date'
指定为 datetime
:
date = datetime.datetime(2018, 10, 12)
这是在 JAVA 运行时通过 GAE 中的 JDO 查询进行日期相等性过滤的一种方法:
public List<User> findByOrganizationIdAndDOB(Long organizationID, Date dateOfBirth) {
PersistenceManager pm = PMF.get().getPersistenceManager();
List<User> userList = null;
try {
Query q = pm.newQuery(User.class);
q.declareImports("import java.util.Date");
q.setFilter("organizationId ==organizationID && dateOfBirth==dateOfBirthParam");
q.declareParameters("Long organizationID, Date dateOfBirthParam");
userList = (List<User>) q.execute(organizationID,dateOfBirth);
return userList;
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
pm.close();
}
}