【问题标题】:strange appengine query result奇怪的appengine查询结果
【发布时间】:2012-06-14 10:18:31
【问题描述】:

我在这个查询中做错了什么?

SELECT * FROM TreatmentPlanDetails 
WHERE 
   accountId = 'ag5zfmRvbW9kZW50d2ViMnIRCxIIQWNjb3VudHMYtcjdAQw' AND 
   status = 'done' AND 
   category = 'chirurgia orale' AND
   setDoneCalendarEventStartTimestamp >= [timestamp for 6 june 2012]  AND 
   setDoneCalendarEventStartTimestamp <= [timestamp for 11 june 2012]  AND 
   deleteStatus = 'notDeleted' 
ORDER BY setDoneCalendarEventStartTimestamp ASC

我没有得到任何记录,我确信有记录满足 where 子句条件。为了获得正确的记录,我必须将时间戳间隔扩大 1 毫秒。正常吗?此外,如果我通过删除类别过滤器来修改此查询,我会得到正确的结果。这绝对是奇怪的。 我也在谷歌群组上问过,但我没有得到答案。无论如何,有关详细信息: https://groups.google.com/forum/?fromgroups#!searchin/google-appengine/query/google-appengine/ixPIvmhCS3g/d4OP91yTkrEJ

【问题讨论】:

  • category = 'chirurgia orale' => category = 'chirurgia orale' 我认为这只是错字。

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


【解决方案1】:

让我们具体谈谈创建时间戳以进入查询。您使用什么代码来创建时间戳记录?显然这很重要,因为对其进行模糊测试会影响查询。可能相关的是,在数据存储中,时间戳被记录为整数,表示以微秒为单位的 posix 时间戳,即自 1970 年 1 月 1 日以来的微秒数(不包括闰秒)。 日期(即没有时间)表示为午夜也很重要,即当天最早的时间。但请告诉我们确切的代码。 (显示您尝试检索的记录的实际内容可能也很重要。)

【讨论】:

  • 您好,感谢您的回答。为避免此类问题,我始终将日期存储为长值(自 1/1/1970 UTC 以来的毫秒数)。这是查询:SELECT * FROM TreatmentPlanDetails WHERE accountId = 'ag5zfmRvbW9kZW50d2ViMnIRCxIIQWNjb3VudHMYtcjdAQw' AND status = 'done' AND category = 'chirurgia orale' AND setDoneCalendarEventStartTimestamp &gt;=1338933600000 AND setDoneCalendarEventStartTimestamp &lt;= 1339365600000 AND deleteStatus = 'notDeleted' ORDER BY setDoneCalendarEventStartTimestamp ASC
  • 这里是查询没有返回的第一条记录。为简单起见,我将仅报告查询中涉及的属性:accountId='ag5zfmRvbW9kZW50d2ViMnIRCxIIQWNjb3VudHMYtcjdAQw'; status='done'; category='chirurgia orale'; setDoneCalendarEventStartTimestamp=1338933600000; deleteStatus='notDeleted'
  • 这是第二条记录。这是查询未返回的第一条记录。为简单起见,我将仅报告查询中涉及的属性:accountId='ag5zfmRvbW9kZW50d2ViMnIRCxIIQWNjb3VudHMYtcjdAQw'; category='chirurgia orale' status='done'; setDoneCalendarEventStartTimestamp=1338933600000; deleteStatus='notDeleted'
  • 因此,对于数据存储而言,时间戳只是一个长属性。只需在数据存储查看器中发出上述 sql 我得到错误的结果,所以我确信不存在时区、时间戳生成或其他问题。只需发出一个查询,该查询在长属性上有两个过滤器。再次感谢。
  • @Nicanor:Python 日期时间类型是精确类型,自 1970 年 1 月 1 日起以微秒的形式存储在数据存储中。所以在这里滚动你自己并没有真正的优势。您所看到的更可能是由于 time.time() 返回一个浮点数。
【解决方案2】:

不特定于您的问题的旁白:实体属性名称计入您的存储配额。如果这将是一个巨大的数据集,您可能会为 setDoneCalendarEventStartTimestamp 之类的属性名称支付比您想要的更多的 $$。

【讨论】:

  • 伙计,你管得太多了。你说的太对了。我从来没有想到这一点。谢谢。
【解决方案3】:

因为你写:

如果我通过删除类别过滤器来修改此查询,我会得到 正确的结果

这可能意味着在您将匹配记录写入数据存储时,该类别没有被索引。如果要将记录添加到新创建的索引中,则必须将记录重新写入数据存储。

【讨论】:

  • 如果重写是指简单地更新记录,我已经这样做了。此外,它没有解释为什么通过将时间戳间隔扩大 2 毫秒,记录开始匹配,而在没有类别过滤器的查询版本中,它在不扩大间隔的情况下匹配......
猜你喜欢
  • 2018-09-01
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
  • 2017-02-26
  • 2023-04-02
相关资源
最近更新 更多