如何在timestampz列中插入UTC值

时间:2019-09-07 06:45:02

标签: postgresql postgresql-9.5

我已经定义了如下表格:

CREATE TABLE mytbl (
    my_timestamp timestamptz NOT NULL DEFAULT now(),
    CONSTRAINT my_tbl_my_timestamp_check CHECK ((date_part('timezone'::text, my_timestamp) = '0'::double precision))
);

您会看到已经进行了检查,以确保只能将UTC值插入到 my_timestamp

列中

现在,如果执行以下操作,我就可以成功插入UTC值:

SET timezone = 'UTC';
INSERT INTO mytbl (my_timestamp) VALUES (NOW()); 

但是我要做的是能够在 my_timestamp 列中插入UTC值,而无需使用 SET timezone ='UTC';

我尝试了以下操作,但它违反了支票:

INSERT INTO mytbl (my_timestamp) VALUES (timezone('utc', now()));

任何人都可以解释我所缺少的吗?

1 个答案:

答案 0 :(得分:0)

PostgreSQL内部将所有时间戳转换为TIMESTAMP WITH TIME ZONE类型(也称为TIMESTAMPTZ)的UTC。这是因为postgres不存储时区信息。

From the docs:

  

对于带时区的时间戳,内部存储的值始终位于   UTC(世界标准时间,通常称为格林威治标准时间)   时间,格林尼治标准时间)。指定了明确时区的输入值是   使用该时区的适当偏移量转换为UTC。如果   在输入字符串中未指定时区,则假定为   在系统的TimeZone参数指示的时区中,并且为   使用时区的偏移量转换为UTC。

换句话说,保存之前不必将时间戳显式转换为UTC。 PostgreSQL会自动为您完成此操作。