我已经定义了如下表格:
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()));
任何人都可以解释我所缺少的吗?
答案 0 :(得分:0)
PostgreSQL内部将所有时间戳转换为TIMESTAMP WITH TIME ZONE
类型(也称为TIMESTAMPTZ
)的UTC。这是因为postgres不存储时区信息。
对于带时区的时间戳,内部存储的值始终位于 UTC(世界标准时间,通常称为格林威治标准时间) 时间,格林尼治标准时间)。指定了明确时区的输入值是 使用该时区的适当偏移量转换为UTC。如果 在输入字符串中未指定时区,则假定为 在系统的TimeZone参数指示的时区中,并且为 使用时区的偏移量转换为UTC。
换句话说,保存之前不必将时间戳显式转换为UTC。 PostgreSQL会自动为您完成此操作。