我目前正在开发一个使用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
有什么事要做吗?
答案 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)
看起来像你的情况