【问题标题】:Google DataStore - how to fetch data by dateGoogle DataStore - 如何按日期获取数据
【发布时间】:2018-10-15 02:42:23
【问题描述】:

我正在尝试为 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)

我做错了什么?

【问题讨论】:

    标签: python google-app-engine google-cloud-datastore


    【解决方案1】:

    旁注:您的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 对象来处理。你可以在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' 属性值不能同时大于和小于相同其他值 - 您的 @987654329 @,出现在两个过滤器中。您需要在 2 个过滤器中提供 2 个不同的开始和结束时间戳值。

    根据您的问题调整上述示例,如下所示:

        query.add_filter('date', '>=', date)
        query.add_filter('date', '<', date + datetime.timedelta(days=1))
    

    你可以将'date'指定为datetime

    date = datetime.datetime(2018, 10, 12)
    

    【讨论】:

      【解决方案2】:

      这是在 GAE 中使用 JAVA 运行时通过 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();
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-07
        • 2018-09-01
        相关资源
        最近更新 更多