搭建两个虚拟环境,操作系统均是cents7。

环境A:

使用timedatectl命令查看时区为 Time zone: Asia/Shanghai (CST, +0800)。

本地数据库时区(show timezone命令)为PRC,等价于cst。

环境B:

时区为America/New_York (EST, -0500),本地数据库时区为US/Eastern,等价于EST。

1. 先针对timestamp with time zone和timestamp without time zone两个配置进行测试。

在环境A的数据库建立数据表并写入数据:

CREAT TABLE test_timestamp(
ttz timestamp with time zone,
twtz timestamp without time zone
);
INSERT INTO test_timestamp VALUES (now(),now());

查看数据:

postgres=# table test_timestamp;
ttz | twtz
-------------------------------+----------------------------
2019-02-15 11:28:26.994804+08 | 2019-02-15 11:28:26.994804
(1 row)

在环境B中,使用python查看:

>>> data = pd.read_sql(''' select * from test_timestamp  ''', conn)
>>> data
ttz twtz
0 2019-02-15 03:28:26.994804+00:00 2019-02-15 11:28:26.994804
>>>

会发现ttz字段自动转换成了UTC时间,而twtz字段原封不动的输出。

再测试环境B写入数据:

本地时间为:$ date
Thu Feb 14 22:33:42 EST 2019
执行cur.execute(''' insert into test_timestamp values('2019-02-14 22:33:42','2019-02-14 22:33:42') ''')

在A的数据库中查看:

postgres=# table test_timestamp;
ttz | twtz
-------------------------------+----------------------------
2019-02-15 11:28:26.994804+08 | 2019-02-15 11:28:26.994804
2019-02-14 22:33:42+08 | 2019-02-14 22:33:42
(2 rows)

发现ttz字段日期值加上了环境A的时区,出现了偏差。因为插入语句用的是字符串类型,是的数据库默认为本地时区。

写入数据时如果调用sql函数:

cur.execute(''' insert into test_timestamp values(now(),now())  ''')

在环境A中:

postgres=# table test_timestamp;
ttz | twtz
-------------------------------+----------------------------
2019-02-15 11:28:26.994804+08 | 2019-02-15 11:28:26.994804
2019-02-14 22:33:42+08 | 2019-02-14 22:33:42
2019-02-15 11:41:13.080922+08 | 2019-02-15 11:41:13.080922
(3 rows)

插入的也是环境A的本地时间。也就是说,最后都是以数据库的环境来执行。

结论:

A. 同一时区内,没有差别。跨时区时,如果只是跨时区读(写操作由一个特定时区完成),可以看成是无差别,都需要转换一下,设置成with time zone可能会好一些,因为在读取的时候有些工具或语言(比如java)会自动转成当地时区的时间。如果是跨时区写,那么就要设置成without time zone,要不然数据库记录的时间会有错误,因为写的时候传的是字符串,数据库会加上本地时区。

B. 不同数据库时间类型的名称不一样,postgres里面没有datetime类型,用timestamp表示datetime;在mysql里有datetime类型,也有timestamp类型(含义和postgres里面不一样)。表示的范围大小、是不是带有时区信息也要查看具体数据库的手册。

C. postgres日期类型一般都是“YYYY-MM-DD HH:mm:ss”格式,不接受一般理解上的数字类型的时间戳(int型数值)的输入。时间类型(比如updatetime和tradedate等)的设置不一定得是数值格式,也可以是日期格式,只是需要注意好时区问题。

postgres10.2时区研究的更多相关文章

  1. tzwhere模块 根据经纬度判断时区

    先说一说这个问题的误区: 1: 根据地理常识,我们知道时区有24个,经度/15=商+余数,此时的商就是是时区,给大组长说了一下,不沾边 又过了几天 2:发现django自带的模块timezone,也叫 ...

  2. fastJSON☞JSONParameters☞时区的修改☞时间最后有一个"Z"

    why... 为什么会有这个问题; 由于近期用到需要将数据序列化... 最终选择了fastJSON(版本为1.)来实现. 但是发现了一个问题,表中有一个dateTime类型的字段, 本来数据库中存入的 ...

  3. Skyfree的毕业论文 《系统封装与部署的深入研究》

    Skyfree的毕业论文 <系统封装与部署的深入研究> https://www.itsk.com/thread-197-1-4.html Skyfree 发表于 2007-9-13 07: ...

  4. 查看/修改 Linux 时间和时区

    查看/修改Linux时区和时间 一.时区      1. 查看当前时区                 date -R      2. 修改设置时区          方法(1)            ...

  5. rtc关机闹钟5 AlarmManager研究

    AlarmManager研究 侯 亮 转自 http://blog.csdn.net/codefly/article/details/17058425 1.概述 在Android系统中,闹钟和唤醒功能 ...

  6. linux概念之时间与时区

    http://www.cnblogs.com/liuyou/archive/2012/07/29/2614338.html Linux时间基准 以上我们了解了RTC(实时时钟.硬件时钟)和OS时钟(系 ...

  7. 3. 深入研究 UCenter API 之 加密与解密(转载)

    1.  深入研究 UCenter API 之 开篇 (转载) 2.  深入研究 UCenter API 之 通讯原理(转载) 3.  深入研究 UCenter API 之 加密与解密(转载) 4.  ...

  8. CST时区,MYSQL与JAVA-WEB服务器时间相差13个小时的问题

    最近倒腾了一台阿里云主机,打算在上面装点自己的应用.使用docker安装了安装mysql后,发现数据库的存储的时间与java-web应用的时间差8个小时,初步怀疑是docker容器时区的问题.经过一系 ...

  9. 世界时区和Java时区详解

    0.引言 Druid中时区的问题一直困扰着我们,所以我专门去研究了一下世界时区和Java中的时区,对使用Druid很用帮助. 1.UTC时间&GMT时间 UTC时间是时间标准时间(Univer ...

随机推荐

  1. HUB、SPAN、TAP比较

    在获取数据包进行网络分析时,常用的方法有三种:HUB.SPAN和TAP. 一 HUB    HUB 很“弱智”,但这种方法却是最早的数据包获取方法.HUB是半双工的以太网设备,在广播数据包时,无法同时 ...

  2. 动态设置progressBar的进度

    progressDrawable = this.getResources().getDrawable(R.drawable.image); progressDrawable.setBounds(mSe ...

  3. 170801、VM性能调优

    最近因项目存在内存泄漏,故进行大规模的JVM性能调优 , 现把经验做一记录. 一.JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老 ...

  4. CH1402 后缀数组【Hash】【字符串】【二分】

    1402 后缀数组 0x10「基本数据结构」例题 描述 后缀数组 (SA) 是一种重要的数据结构,通常使用倍增或者DC3算法实现,这超出了我们的讨论范围.在本题中,我们希望使用快排.Hash与二分实现 ...

  5. Mysql和sqlite数据库操作心得

    经过最近一段时间的实际工作发现,原来只是认为Mysql和sqlite是分别独立的,数据传输和共享或有障碍,其实这是一个误区.当我们想要将sqlite中的数据存放到mysql中,最好的方法就是利用中间文 ...

  6. android使用library

      http://www.vogella.com/tutorials/AndroidLibraryProjects/article.html     介绍support lib使用 http://de ...

  7. 每次收到的 HTTP 请求,就可以打开一个 SqlSession,返回一个响应,就关闭它

    mybatis – MyBatis 3 | 入门 http://www.mybatis.org/mybatis-3/zh/getting-started.html 作用域(Scope)和生命周期 理解 ...

  8. pandas 取消读取csv时默认第一行为列名

    读取时默认第一行为列名 此时DataFrame的列名为第一行数据: 因为第一行为有效数据,故不可作为列名,要么重新起列名,要么使用默认序列列名: 取消默认第一行为列名 给 pd.read_csv() ...

  9. git学习------> 解决Gitlab 版本升级之后,发送 merge request 出现 http 500 的返回码错误

    今天有同事在Gitlab上发送 Merge Request的时候,直接出现如下所示的界面,提示http 500,服务器内部出错. 一.错误描述 1.1 创建新的 Merge Request 1.2 填 ...

  10. [GDAL]在三维场景中显示DEM

    粗糙实现了个版本 存储波段的基本信息和数据: namespace RGeos.Terrain { //存储波段的基本信息和数据 public class RasterBandData { public ...