PostgreSQL TIMESTAMP类型 时间戳操作

PostgreSQL 提供两种存储时间戳的数据类型: 不带时区的 TIMESTAMP 和带时区的 TIMESTAMPTZ。

TIMESTAMP 数据类型可以同时存储日期和时间,但它不存储时区。这意味着,当修改了数据库服务器所在的时区时,它里面存储的值不会改变。

TIMESTAMPTZ 数据类型在存储日期和时间的同时还能正确处理时区。PostgreSQL 使用 UTC 值来存储 TIMESTAMPTZ 数据。在向 TIMESTAMPTZ 字段插入值的时候,PostgreSQL 会自动将值转换成 UTC 值,并保存到表里。当从一个 TIMESTAMPTZ 字段查询数据的时候,PostgreSQL 会把存储在其中的 UTC 值转换成数据库服务器、用户或当前连接所在的时区。

TIMESTAMP 和 TIMESTAMPTZ 都使用8字节存储空间。如下所示:

SELECT
   typname,
   typlen
FROM
   pg_type
WHERE
   typname ~ '^timestamp';
  typname  | typlen
-------------+--------
 timestamp  |   8
 timestamptz |   8
(2 rows)

重要提示,TIMESTAMPTZ 并不会存储时区,它只是了 UTC 值,然后会和当前时区进行转换。

时间戳示例

首先,创建一个含有 TIMESTAMP 和 TIMESTAMPTZ 的表:

CREATE TABLE timestamp_demo (ts TIMESTAMP, tstz TIMESTAMPTZ);

接下来,将数据库服务器的时区设置为 America/Los_Angeles:

SET timezone = 'America/Los_Angeles';

顺便说一句,可以使用 SHOW TIMEZONE 语句来显示当前时区:

SHOW TIMEZONE;

然后,插入一些示例数据:

INSERT INTO timestamp_demo (ts, tstz)
VALUES
 (
 '2016-06-22 19:10:25-07',
 '2016-06-22 19:10:25-07'
 );

最后,查询:

SELECT
 ts
FROM
 timestampz_demo;
     ts     |     tstz
---------------------+------------------------
 2016-06-22 19:10:25 | 2016-06-22 19:10:25-07
(1 row)

再把时区设置为 America/New_York:

SET timezone = 'America/New_York';

再查询一次,结果如下:

     ts     |     tstz
---------------------+------------------------
 2016-06-22 19:10:25 | 2016-06-22 22:10:25-04
(1 row)

TIMESTAMP 类型字段的值不变,而 TIMESTAMPTZ 类型字段的值变成了当前时区下的时间。

补充:postgresql timestamp timestamptz 使用注意事项

postgresql日期时间类型分为timestamp [ (p) ] [ without time zone ]和timestamp [ (p) ] with time zone,它们的区别在于一个无时区,另一有时区,存储大小均为8字节.

同时也要注意time [ (p) ] [ without time zone ]和time [ (p) ] with time zone类型,无时区存储大小为8字节,有时区存储大小为12字节.

postgresql中日期时间类型缩写:

timestamp

timestamptz

date (仅年月日部份,存储大小为4字节)

time

timetz

interval(表示间隔,存储大小为16字节)

interval可以通过函数make_interval来创建,支持年\月\星期\天\小时\分钟\秒的间隔.如now() + make_interval(days => 10)表示10天后,now() - make_interval(secs => 30)表示30秒之前

为保证数据的准确性在保存\使用\计算过程中应尽量使用timestamptz和timetz,尽量避免使用timestamp和time

UTC+8(EAT - 东亚标准时间/中国标准时间(BJT))

注意整个中国使用相同的时区,这就使得这个时区特别的大。在中国最西部的地区,太阳最高的时候是下午3点,在最东部是上午11点。单纯从地理规划来看,整个中国横跨了从东五区(UTC+5)到东九区(UTC+9)共计五个时区。

在postgresql中查询时区的定义

select * from pg_timezone_names

或查询东亚/中国时区定义

select * from pg_timezone_names where utc_offset = '+08:00:00';

查询结果中的"PRC","Asia/Shanghai","Asia/Chongqing"均表示中国

生成一个日期时间示例

select make_timestamptz(1970,1,1,0,0,0.0,'Asia/Shanghai')

注意避免使用timestamp类型相关函数,如:make_timestamp

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • PostgreSQL 修改表字段常用命令操作

    --数据库.模式.表名 "identities"."Test"."tab_test" --修改字段名 ALTER TABLE "identities"."Test"."tab_test" RENAME "u_name" to realname ; --添加字段 ALTER TABLE "identities"."Test".&q

  • PostgreSQL 中字段类型varchar的用法

    PostgreSql数据库中varchar类型与sql server中字段用法有差别,PostgreSql中如果字段设置为varchar类型长度为10,则无论存字母.数字或其它符号,长度最大为10个,也就是字母和汉字占的位置是一样的. Sql server中如设置字段类型为nvarchar类型长度为10,则存汉字最大为5个,字母为10个,字母加汉字混合时,字母和汉字占的长度一样 补充:Postgresql 数据库 varchar()字符占用多少字节 如下所示: create table tmp1

  • PostgreSQL 如何修改文本类型字段的存储方式

    PostgreSQL存储方式分为以下4种: PLAIN避免压缩或者线外存储:而且它禁用变长类型的单字节头部.这是不可TOAST数据类型列的唯一可能的策略.只是对那些不能TOAST的数据类型才有可能. EXTENDED允许压缩和线外存储.这是大多数可TOAST数据类型的默认策略. 首先将尝试进行压缩,如果行仍然太大,那么则进行线外存储. EXTERNAL允许线外存储,但是不许压缩.使用EXTERNAL将令那些在宽text和 bytea列上的子串操作更快(代价是增加了存储空间), 因此这些操作被优化

  • 浅谈postgresql数据库varchar、char、text的比较

    如下所示: 名字 描述 character varying(n), varchar(n) 变长,有长度限制 character(n), char(n) 定长,不足补空白 text 变长,无长度限制 简单来说,varchar的长度可变,而char的长度不可变,对于postgresql数据库来说varchar和char的区别仅仅在于前者是变长,而后者是定长,最大长度都是10485760(1GB) varchar不指定长度,可以存储最大长度(1GB)的字符串,而char不指定长度,默认则为1,这点需要

  • 基于PostgreSQL和mysql数据类型对比兼容

    1.数值类型 整数: mysql中的整数类型和pg相比,两者有以下区别: mysql:mysql中支持int 1,2,3,4,8 字节,同时支持有符号,无符号.并且mysql中支持在数值列中指定zerofill,用来将存储的数值通过填充0的方式达到指定数据类型的长度(mysql8开始不建议使用ZEROFILL属性,并且在将来的MySQL版本中将不再支持该属性). pg:pg支持 int 2,4,8 字节,且数值都是有符号的. mysql整数类型: pg整数类型: 那么对于mysql中的1,3字节

  • 解决postgreSql 将Varchar类型字段修改为Int类型报错的问题

    项目使用postgreSql数据库,先需要将库中的某个表中的某个字段类型由Varchar改成Int,直接右键设计表,修改类型为int,保存的时候报错,错误如下: 意思就是,这个crt_user字段不能自动转换成成类型bigint,需要使用USING表达式来转换. 这是在库中运行修改字段的类型的sql: ALTER TABLE auth_client_service ALTER COLUMN crt_user SET DATA TYPE int8 USING crt_user:: int8, AL

  • PostgreSQL TIMESTAMP类型 时间戳操作

    PostgreSQL 提供两种存储时间戳的数据类型: 不带时区的 TIMESTAMP 和带时区的 TIMESTAMPTZ. TIMESTAMP 数据类型可以同时存储日期和时间,但它不存储时区.这意味着,当修改了数据库服务器所在的时区时,它里面存储的值不会改变. TIMESTAMPTZ 数据类型在存储日期和时间的同时还能正确处理时区.PostgreSQL 使用 UTC 值来存储 TIMESTAMPTZ 数据.在向 TIMESTAMPTZ 字段插入值的时候,PostgreSQL 会自动将值转换成 U

  • PostgreSQL 数组类型操作使用及特点详解

    目录 PostgreSQL 数组类型使用详解 下面列出一些PostgreSQL的特点 数组类型的基本操作 1 查询 2 插入数据 3 条件查询 4 更新 4.1 更新标签的名称 4.2 添加一个标签 5 删除 总结 PostgreSQL 数组类型使用详解 可能大家对 PostgreSQL这个关系型数据库不太熟悉,因为大部分人最熟悉的,公司用的最多的是 MySQL 我们先对PostgreSQL数据库 (下面简称 PG)简单的介绍一下,以后有机会,再单独写一篇专门介绍pgSql的文章 The Wor

  • C#更新SQLServer中TimeStamp字段(时间戳)的方法

    本文实例讲述了C#更新SQLServer中TimeStamp字段(时间戳)的方法.分享给大家供大家参考.具体实现方法如下: public partial class Form1 : Form { private SqlConnection mCnn = null; private long TimeStampValue; public Form1() { InitializeComponent(); mCnn = new SqlConnection(); mCnn.ConnectionStrin

  • PostgreSQL timestamp踩坑记录与填坑指南

    项目Timezone情况 NodeJS:UTC+08 PostgreSQL:UTC+00 timestampTest.js const { Client } = require('pg') const client = new Client() client.connect() let sql = `` client.query(sql, (err, res) => { console.log(err ? err.stack : res.rows[0].datetime) client.end(

  • 简单介绍Ruby on Rails对PostgreSQL数组类型的支持

    我非常高兴在宣布Rails 4.0 现在支持 PostgreSQL数组类型. 你可以方便的在migration通过 :array => true里创建数组类型的字段. 创建数组类型的字段的时候还可以添加其它的选项(length,default,等等) create_table :table_with_arrays do |t| t.integer :int_array, :array => true # integer[] t.integer :int_array, :array =>

  • PostgreSQL自动更新时间戳实例代码

    目录 什么是PostgreSQL时间戳数据类型? 一.为什么 二.如何做 总结 什么是PostgreSQL时间戳数据类型? 在PostgreSQL中,下一个数据类型是 TIMESTAMP ,它可以存储 TIME 和 DATE 值.但它不支持任何 时区数据.这意味着当我们转换数据库服务器的 时区时, 时间戳值将存储在数据库中,并且不能重复修改. 在PostgreSQL中,TIMESTAMP数据类型分为 两种时间数据类型,如下: timestamp timpstamptz Timestamp: :

  • Java Date时间类型的操作实现

    本文主要介绍Java Date 日期类型,以及Calendar的怎么获取时间,然后写成时间工具类里面有下面这些方法: - 时间转字符串(有默认时间格式,带时间格式) - 字符串转时间(有默认时间格式,带时间格式) - 计算两个日期之间相差的天数 - 计算当前时间多少天以后的日期 - 判断是否是日期格式 代码 很多说明都注释在代码上: package datedemo; import java.text.SimpleDateFormat; import java.util.Calendar; im

  • MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决

    目录 TIMESTAMP类型返回日期时间数据中带有 T 场景描述 通过注解格式化(方法一) 通过全局配置(方法二) MySQL时间类型timestamp知识点 mysql日期时间类型 Timestamp实例 总结 TIMESTAMP类型返回日期时间数据中带有 T 场景描述 MySQL 中使用 TIMESTAMP 类型 实体类使用 java.util.Date 类型 返回 JSON 数据: 通过注解格式化(方法一) 可以在日期类型属性上,或者 GET 方法加上 Jackson 的 @JsonFor

  • 浅谈Python 集合(set)类型的操作——并交差

    阅读目录 •介绍 •基本操作 •函数操作 介绍 python的set是一个无序不重复元素集,基本功能包括关系测试和消除重复元素. 集合对象还支持并.交.差.对称差等. sets 支持 x in set. len(set).和 for x in set.作为一个无序的集合,sets不记录元素位置或者插入点.因此,sets不支持 indexing, slicing, 或其它类序列(sequence-like)的操作. 基本操作 >>> x = set("jihite")

  • PHP弱类型语言中类型判断操作实例详解

    本文实例讲述了PHP弱类型语言中类型判断操作.分享给大家供大家参考,具体如下: 1.php一个数字和一个字符串进行比较或者进行运算时,PHP会把字符串转换成数字再进行比较.PHP转换的规则的是:若字符串以数字开头,则取开头数字作为转换结果,若无则输出0. 例如:123abc转换后应该是123,而abc则为0,0==0这当然是成立的.具体可以参考官方手册:如果比较一个整数和字符串,则字符串会被转换为整数 $a = ($b=4)+5; echo $a; //9 echo '<p>'; var_du

随机推荐