时间戳,相同的时间点,但同一查询的不同表示与设置本地时区'

时间:2016-08-31 22:23:51

标签: sql postgresql timezone node-postgres pg-promise

我正在尝试构建我的Web应用程序,该应用程序将数据存储在地球上某个位置上运行的PostgreSQL数据库服务器上,并且用户可以从其他位置连接,因此可能与我的服务器不同的时区和偏移量。

我需要根据每个连接用户显示操作的日期和时间,例如创建的帖子,编辑的帖子,提交的评论等。这就像StackExchange一样。但是我遇到了时区和偏移问题,如下所述:

我的 pgAdmin3 SQL编辑器中的所有内容似乎都正常。例如,当我使用set local time zone 'Europe/Oslo' pgAdmin3 SQL编辑器中编写下面的查询时,我得到的poststagscreated_at字段都正确输出中有+2偏移量。在输出行中,created_at表的posts字段为2016-08-29 19:15:53.758+02created_at表的同一行tags2016-08-29T19:15:53.758+02:00

然而,当我把它放在 Nodejs Express.js 服务器中的路由功能中时带< em> pg-promise 作为连接库,我只得到tagscreated_at字段正确,Oslo中的时间,并按预期附加时区偏移,我得到{ created_atposts表的{1}}字段与预期不符。

所有时间戳定义为UTC,如下所示。此外,如果没有设置timestamp(3) with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP,我会得到相同的行为,对于第一个表我得到set local time zone时间,对于后者我得到时间戳并附加服务器的偏移量。

UTC指令不绑定所有查询吗?我的方法缺少什么?

我使用的示例查询:

set local time zone

示例express.js路由功能:

select
    q.*, -- created_at timestamp (with time zone) is one of those columns
    u.name as author,
    u.reputation,
    case when count(t.*)=0 then '[]' e json_agg(t.*) end as tags
from posts q

-- authors
join users u
on q.author_id = u.id

-- tags
left join post_has_tag p_h_t
on q.id = p_h_t.post_id
left join tags t
on p_h_t.tag_id = t.id

where q.post_type = 'question'
group by q.id, u.id;

我使用 pg-promise Express.js http服务器获得的结果。请注意实际应该指向UTC的相同点的不同时间戳,这是正确完成的,以及未正确完成的表示:

trialRoutes.get('/x', function (req, res) {
    db.query(
        `
        --begin;
        SET LOCAL TIME ZONE 'Europe/Oslo';
        SELECT
            q.*, -- created_at timestamp (with time zone) is already in here
            u.name AS author,
            u.reputation,
            CASE WHEN count(t.*)=0 THEN '[]' ELSE json_agg(t.*) END as tags
        FROM posts q

        -- authors
        JOIN users u
        ON q.author_id = u.id

        -- tags
        left join post_has_tag p_h_t
        on q.id = p_h_t.post_id
        left join tags t
        on p_h_t.tag_id = t.id

        WHERE q.post_type = 'question'
        group by q.id, u.id;
        --commit;
        `
    )
        .then(function (data) {
            res.json(data)
        })
        .catch(function (error) {
            console.log("/login, database quesry error.", error);
        });
})

此处使用的[ { "id": "7", "created_at": "2016-08-29T21:02:04.153Z", // same point in time, different representation "title": "AAAAAAAAAAA", "text": "aaaaa aaaaaaa aaaaaa", "post_url": "AAAAAAAAAAA", "score": 0, "author_id": 1, "parent_post_id": null, "post_type": "question", "is_accepted": false, "acceptor_id": null, "timezone": "2016-08-29T20:02:04.153Z", "author": "Faruk", "reputation": 0, "tags": [ { "id": 4, "created_at": "2016-08-29T23:02:04.153+02:00", // same point in time, different representation "label": "physics", "description": null, "category": null } ] }, { "id": "6", "created_at": "2016-08-29T17:24:10.151Z", "title": "Ignoring timezones altogether in Rails and PostgreSQL", "text": "Ignoring timezones altogether in Rails and PostgreSQL", "post_url": "Ignoring-timezones-altogether-in-Rails-and-PostgreSQL", "score": 0, "author_id": 2, "parent_post_id": null, "post_type": "question", "is_accepted": false, "acceptor_id": null, "timezone": "2016-08-29T16:24:10.151Z", "author": "Selçuk", "reputation": 0, "tags": [ { "id": 3, "created_at": "2016-08-29T19:24:10.151+02:00", "label": "sql", "description": null, "category": null } ] } ] posts表的定义:

tags

0 个答案:

没有答案