在DB Vs Python中刷新物化视图之间的区别

时间:2018-02-07 15:34:58

标签: python postgresql sqlalchemy

我目前正在开发一个使用SQL(postgresql)进程和python进程进行预测的项目。在python进程开始之前准备信息需要一系列物化视图。 现在我用sqlAlchemy刷新那些视图并且有区别,因为当python刷新它时,列日期(来自产生date_trunc('month',date)的查询)不是日期的月份上一个表,但是原始表日期的前一个月的最后一天。

举个例子: 表1的日期为2017-12-02至2018-02-04 date_trunc的结果应该是:

2018-01-01 00:00:00.000000
2017-12-01 00:00:00.000000
2018-02-01 00:00:00.000000

但结果是:

mes
2017-11-30 21:00:00.000000
2017-12-31 21:00:00.000000
2018-01-31 21:00:00.000000

有什么事要做吗?

1 个答案:

答案 0 :(得分:0)

我相信您的不同客户有不同的时区。为了证明这一点,我将这样做:

t=# create table so6(t timestamp,tz timestamptz);
CREATE TABLE
t=# insert into so6 select date_trunc('month',now()),date_trunc('month',now());
INSERT 0 1
t=# set timezone to 'GMT-3';
SET
t=# insert into so6 select date_trunc('month',now()),date_trunc('month',now());
INSERT 0 1
t=# select * from so6;
          t          |           tz
---------------------+------------------------
 2018-02-01 00:00:00 | 2018-02-01 03:00:00+03
 2018-02-01 00:00:00 | 2018-02-01 00:00:00+03

(2 rows)

正如您所看到的,根据您的客户端,TimeZone设置结果会有所不同。

现在,如果您选择带有第一个客户时区的结果,则会得到:

t=# set timezone to 'utc';
SET
t=# select * from so6;
          t          |           tz
---------------------+------------------------
 2018-02-01 00:00:00 | 2018-02-01 00:00:00+00
 2018-02-01 00:00:00 | 2018-01-31 21:00:00+00
(2 rows)

看起来像你的情况