PostgreSQL timestamp踩坑记录与填坑指南
console.log(err err.stack : res.rows[0].datetime)
client.end()
}) 不同时区to_timestamp查询结果
测试输入数据为1514736000(UTC时间2017-12-31 16:00:00,北京时间2018-01-01 00:00:00)
1、timezone=UTC
BEGIN;
SET TIME ZONE UTC
SELECT to_timestamp(1514736000) as datetime;
END;
直接查询:2017-12-31 16:00:00+00YES
pg查询:2017-12-31T16:00:00.000ZYES
2、timezone=PRC
BEGIN;
SET TIME ZONE PRC
SELECT to_timestamp(1514736000) as datetime;
END;
直接查询:2018-01-01 00:00:00+08NO
pg查询:2017-12-31T16:00:00.000ZYES
PostgreSQL官方文档对timestamp的一个描述
详见:8.5.1.3. Time Stamps
In a literal that has been determined to be timestamp without time zone, PostgreSQL will silently ignore any time zone indication. That is, the resulting value is derived from the date/time fields in the input value, and is not adjusted for time zone.
使用to_timestamp进行时间转换且DB时区非UTC时,写入**timestamp without time zone**类型的COLUMN则会与预期结果不符。
不同Timezone/columnType查询结果1、timezone=UTC,timestamp with timezone
BEGIN;
SET TIME ZONE UTC
SELECT TIMESTAMP WITH TIME ZONE 2017-12-31T16:00:00+00 as datetime;
END;
直接查询:2017-12-31 16:00:00+00YES
pg查询:2017-12-31T16:00:00.000ZYES
2、timezone=UTC,timestamp without timezone
BEGIN;
SET TIME ZONE UTC
SELECT TIMESTAMP 2017-12-31T16:00:00+00 as datetime;
END;
直接查询:2017-12-31 16:00:00YES
pg查询:2017-12-31T08:00:00.000ZNO
3、timezone=PRC,timestamp with timezone
BEGIN;
SET TIME ZONE PRC
SELECT TIMESTAMP WITH TIME ZONE 2017-12-31T16:00:00+00 as datetime;
END;
直接查询:2018-01-01 00:00:00+08YES
pg查询:2017-12-31T16:00:00.000ZYES
4、timezone=PRC,timestamp without timezone
BEGIN;
SET TIME ZONE PRC
SELECT TIMESTAMP 2017-12-31T16:00:00+00 as datetime;
END;
直接查询:2017-12-31 16:00:00YES
pg查询:2017-12-31T08:00:00.000ZNO
据以上结果可判定:
使用pg查询**timestamp without time zone**类型的COLUMN时,会将数据库存储的时间当做北京时间而非UTC时间,与数据库时区没有关系。
网上类似问题的解决办法是将DB时区改为UTC+08。
原理:写入DB的时间实际为北京时间,pg库恰好是当做北京时间读取,所以时间戳就不会出问题了。
假如应用部署在不同的地域,使用timestamp without time zone存储timestamp这样的设计简直是灾难。
不要用timestamp without time zone存储timestamp!
不要用timestamp without time zone存储timestamp!
不要用timestamp without time zone存储timestamp!
补充:pg查询时间间隔(timestamp类型)
create_date timestamp(6) without time zone
1.从2015-10-12到2015-10-13 之间的4点到9点的数据
select * from schedule where create_date
between to_date( 2015-10-12 , yyyy-MM-dd )
and to_date( 2015-10-13 , yyyy-MM-dd )
and EXTRACT(hour from create_date) between 4 and 9;
结果:
2.2015-10-12五点的数据
select * from schedule where hospital_id= syzyyadmin and date_trunc( hour ,create_date)=to_timestamp( 2015-10-12 05 , YYYY-MM-DD HH24 )
结果:
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
我想要获取技术服务或软件
服务范围:MySQL、ORACLE、SQLSERVER、MongoDB、PostgreSQL 、程序问题
服务方式:远程服务、电话支持、现场服务,沟通指定方式服务
技术标签:数据恢复、安装配置、数据迁移、集群容灾、异常处理、其它问题
本站部分文章参考或来源于网络,如有侵权请联系站长。
数据库远程运维 PostgreSQL timestamp踩坑记录与填坑指南
相关文章
- 教你如何设置postgresql数据库连接数及查看相关信息
- 详解PostgreSQL 数据库 自动Vacuum配置方式
- 基于postgresql行级锁for update测试
- PostgreSQL基础知识之SQL操作符实践指南
- PostgreSQL教程(二):模式Schema详解
- PostgreSQL缺省值详解数据库
- 数据库使用PostgreSQL实现分布式数据库构建(postgresql分布式)
- PostgreSQL 取值与行号实践研究(postgresql行号)
- 大全PostgreSQL命令指南:开发者必备技能(postgresql命令)
- 快速安全!PostgreSQL下载,数据库管理必备!(postgresql下载)
- 利用 PostgreSQL 脚本加速数据库操作!(postgresql脚本)
- PostgreSQL 掌握精妙的数据类型(postgresql类型)