夏季和冬季postgres时区/时间戳

时间:2018-05-15 09:01:26

标签: postgresql timestamp

我将csv数据上传到postgres的表中。其中一列是带有纪元填充的字符变化列。进入的数据如下:

select 
    TIMESTAMP WITH TIME ZONE 'epoch' + timestamp::integer * INTERVAL '1 second' as timestamp
from
    table

将纪元字符变化列转换为时间戳列,如下所示:

SELECT EXTRACT(TIMEZONE FROM timestamp) FROM table;

结果似乎很好,我继续说。我住在荷兰,在这里,我们每年有两次冬季夏季变化。显然我的数据没有区别。

我试图找出我目前的时区。我这样做了:

3,600.0000

导致:

show timezone
= Europe/Berlin

当我试图找出我的一般时区时,我得到了这个:

db.tx(async t => {
        var file = await t.one(`insert into ui.user_datasets_files (user_dataset_id,filename) values (${itemId},'${fileName}') RETURNING id`);
        var data = rows.map(row => {
            return {
                user_dataset_id: itemId,
                file_id: file.id,
                json_data: JSON.stringify(row)
            };
        });
        const insert = pgPromise.helpers.insert(data, dataset_data_columns);
        return t.none(insert);

}).then(() => callback()).catch(err => callback(err));

如何让我的时间戳识别夏天和冬天?或者我做错了什么?

1 个答案:

答案 0 :(得分:2)

在将纪元值(为什么存储为字符串?)转换为timestamp with time zone的所有创造性方法中,这是一个更有趣的方法。

简单而无聊的方式是

SET timezone = 'Europe/Berlin';

SELECT to_timestamp(1507656308);

      to_timestamp      
------------------------
 2017-10-10 19:25:08+02
(1 row)

时区偏移为两小时,因为在10月10日,夏令时生效(中欧夏令时)。

事实上:

SELECT extract(timezone FROM to_timestamp(1507656308));

 date_part 
-----------
      7200
(1 row)

所以一切都按预期工作,对吧?