Sql Django从postgres视图中选择时返回错误的结果
我在postgres中定义了一个视图,该视图位于它所使用的数据的单独模式中。 它包含三列:Sql Django从postgres视图中选择时返回错误的结果,sql,django,postgresql,sql-view,Sql,Django,Postgresql,Sql View,我在postgres中定义了一个视图,该视图位于它所使用的数据的单独模式中。 它包含三列: mydb=# \d "my_views"."results" View "my_views.results" Column | Type | Modifiers -----------+-----------------------+----------- Date | date | Something | ch
mydb=# \d "my_views"."results"
View "my_views.results"
Column | Type | Modifiers
-----------+-----------------------+-----------
Date | date |
Something | character varying(60) |
Result | numeric |
当我从psql或adminer查询它时,会得到如下结果:
bb_adminpanel=# select * from "my_views"."results";
Date | Something | Result
------------+-----------------------------+--------------
2015-09-14 | Foo | -3.36000000
2015-09-14 | Bar | -16.34000000
2015-09-12 | Foo | -11.55000000
2015-09-12 | Bar | 11.76000000
2015-09-11 | Bar | 2.48000000
但是,通过django查询,我得到了一个不同的集合:
(c是数据库上的游标对象)
这根本不匹配-前两行是正确的,但后两行非常奇怪-它们有一个移动的日期,最后一条记录的结果是最后两行的总和
我不知道为什么会这样,欢迎任何建议
以下是视图定义:
SELECT a."Timestamp"::date AS "Date",
a."Something",
sum(a."x") AS "Result"
FROM my_views.another_view a
WHERE a.status::text = ANY (ARRAY['DONE'::character varying::text, 'CLOSED'::character varying::text])
GROUP BY a."Timestamp"::date, a."Something"
ORDER BY a."Timestamp"::date DESC;
“另一个视图”如下所示:
Column | Type | Modifiers
---------------------------+--------------------------+-----------
Timestamp | timestamp with time zone |
Something | character varying(60) |
x | numeric |
status | character varying(100) |
(一些栏目被推荐)这个问题的简单解释是:时区 详细说明:在连接到PostgreSQL控制台时,您没有声明任何时区设置,但django会在每个查询上声明。这样,一些记录的时间戳将根据使用的时区(例如数据)指向不同的日期
+-------------------------+-----------+-------+--------+
| timestamp | something | x | status |
+-------------------------+-----------+-------+--------+
| 2015-09-11 12:00:00 UTC | foo | 2.48 | DONE |
| 2015-09-12 00:50:00 UTC | foo | 11.76 | DONE |
+-------------------------+-----------+-------+--------+
使用时区UTC执行的视图查询将给出2行,但使用时区GMT-2执行的查询将只给出一行。因为在GMT-2时区中,第二行的时间戳仍然在2015-09-11天
要解决此问题,您可以编辑视图,使其始终根据指定的时区对日期进行分组:
SELECT (a."Timestamp" AT TIME ZONE 'UTC')::date AS "Date",
a."Something",
sum(a."x") AS "Result"
FROM my_views.another_view a
WHERE a.status::text = ANY (ARRAY['DONE'::character varying::text, 'CLOSED'::character varying::text])
GROUP BY (a."Timestamp" AT TIME ZONE 'UTC'), a."Something"
ORDER BY (a."Timestamp" AT TIME ZONE 'UTC') DESC;
这样,天数将始终根据“UTC”时区计算 什么是
“betbot\u视图”“每日结果”
,为什么在代码中使用它而不是“我的视图”“结果”
?您能显示视图定义(重新创建视图的SQL代码)吗?如果您能为视图显示源表中的一些示例,也会很有帮助。@GwynBleidD这些名称只是我忘记一致地编辑它们的结果,现在已经修复了。至于视图定义,它是一个相当复杂的视图,取决于其他视图和大量数据。我本希望那不重要。我可以说的一件事是,这些数据在不同的调用之间没有变化,因为我已经用准确的结果在两天内检查了好几次。有一个可能的解决方案,但要确认我必须知道源数据中的字段类型以及如何计算视图中的字段。这不是缓存,而是数据类型和环境变化。@GwynBleidD在问题中添加了定义。
SELECT (a."Timestamp" AT TIME ZONE 'UTC')::date AS "Date",
a."Something",
sum(a."x") AS "Result"
FROM my_views.another_view a
WHERE a.status::text = ANY (ARRAY['DONE'::character varying::text, 'CLOSED'::character varying::text])
GROUP BY (a."Timestamp" AT TIME ZONE 'UTC'), a."Something"
ORDER BY (a."Timestamp" AT TIME ZONE 'UTC') DESC;