Google DataStore - 如何按日期获取数据

Min*_*Min 0 python google-app-engine google-cloud-datastore

我正在尝试为DataStore编写一个fetch查询.

在数据存储区中,它具有日期字段列,格式为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)
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Dan*_*scu 5

旁注:你date是一个整数,传递给它是datetime.strptime(date, '%Y%m%d')行不通的,你会得到一个TypeError: strptime() argument 1 must be string, not int.您需要使用字符串,而不是int.但这不是问题所在.

在数据存储区中,它具有日期字段列,格式为2018-02-20(11:07:36.000)MMT

格式无关紧要,您不应将时间戳属性作为字符串进行操作.换句话说,你不应该使用strftime/strptime.您应该将它们作为datetime对象处理.您可以在查询限制中找到示例:

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)
Run Code Online (Sandbox Code Playgroud)

另一个重要的注意事项是,添加过滤器的查询将永远不会产生任何结果:没有'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))
Run Code Online (Sandbox Code Playgroud)

你指定'date'datetime:

date = datetime.datetime(2018, 10, 12)
Run Code Online (Sandbox Code Playgroud)