【问题标题】:Ecto.Adapters.SQL.query! gives a different resultEcto.Adapters.SQL.query!给出不同的结果
【发布时间】:2020-05-12 17:07:03
【问题描述】:

所以这显然是这些奇怪的日子之一......而且我知道这没有意义。

我正在 datagrip(一种执行原始查询的工具)中对与我的 phoenix 应用程序中完全相同的数据库执行查询。他们返回的结果不同。

查询相当复杂,但它是唯一显示不同结果的查询。所以我不能简化它。我尝试了其他查询以确保我拥有相同的数据库、重新启动服务器等。

这是从我的控制台执行的完全相同的查询。如您所见,结果不一样。缺少几行。

我还通过执行select now() => 来检查这是否是时间问题(或多或少很明显)。如果我只执行 generate_series 部分,它会返回相同的结果。所以它可能与连接有关。

我还检查了ttnmessages 表中的最后几个条目,以确保没有一般的缓存问题。那里的查询也确实给出了相同的结果。

所以我的问题是:Ecto 在执行查询时有什么不同吗?我怎么能弄清楚这个?我很感激任何提示。

编辑:查询在这两种情况下:

SELECT g.series AS time, MAX((t.payload ->'pulse')::text::numeric) as pulse
FROM generate_series(date_trunc('hour', now())- INTERVAL '12 hours', date_trunc('hour', now()), INTERVAL '60 min') AS g(series)
LEFT JOIN ttnmessages t
ON t.inserted_at < g.series + INTERVAL '60 min'
AND t.inserted_at > g.series
WHERE t.hardware_serial LIKE '093B55DF0C2C525A'
GROUP BY g.series
ORDER BY g.series;

【问题讨论】:

  • 要弄清楚使用Ecto.Adapters.SQL.to_sql/3;我在这里无法提供更多帮助,因为您已决定发布屏幕截图而不是 SO 在规则中要求的纯文本,因此,我无法阅读它们的内容。
  • 谢谢,我已将查询添加为纯文本。我已经在两端使用 SQL,所以 to_sql/3 不会帮助我。

标签: postgresql elixir ecto


【解决方案1】:

虽然我没有查明原因,但我将查询更改为以下内容:

SELECT MAX(t.inserted_at) as time, (t.payload ->'pulse')::text::numeric as pulse
FROM ttnmessages t
WHERE t.inserted_at > now() - INTERVAL '12 hours'
  AND t.payload ->'pulse' IS NOT NULL
  AND t.hardware_serial LIKE '093B55DF0C2C525A'
GROUP BY (t.payload ->'pulse')
ORDER BY time;

运行时间

我将忽略问题的不同结果。此处的查询返回与预期相同的结果。

【讨论】:

  • 我现在确信原来的错误与now() 有关。也许它记得执行它的上下文?还是 DataGrip 会自动将其转换为 utc?无论如何,使用它是一个坏主意......
猜你喜欢
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-17
  • 2015-08-21
  • 2018-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多