时间类型
名字 | 描述 |
---|---|
timestamp [ (p) ] [ without time zone ] | 包括日期和时间(无时区) |
timestamp [ (p) ] with time zone | 包括日期和时间,有时区 |
date | 日期(没有一天中的时间) |
time [ (p) ] [ without time zone ] | 一天中的时间(无日期) |
time [ (p) ] with time zone | 仅仅是一天中的时间(没有日期),带有时区 |
interval [ fields ] [ (p) ] | 时间间隔 |
date
就是日期的格式
db=# create table demo_date(date date);
CREATE TABLE
db=# insert into demo_date values('2020-12-12 12:12:23.000');
INSERT 0 1
db=# select * from demo_date;
date
------------
2020-12-12
(1 row)
日期输入的方式可以有很多中,如下
例子 | 描述 |
---|---|
1999-01-08 | ISO 8601; 任何模式下的1月8日 (推荐格式) |
January 8, 1999 | 在任何datestyle输入模式下都无歧义 |
1/8/1999 | MDY模式中的1月8日;DMY模式中的8月1日 |
1/18/1999 | MDY模式中的1月18日;在其他模式中被拒绝 |
01/02/03 | MDY模式中的2003年1月2日; DMY模式中的2003年2月1日; YMD模式中的2001年2月3日 |
1999-Jan-08 | 任何模式下的1月8日 |
Jan-08-1999 | 任何模式下的1月8日 |
08-Jan-1999 | 任何模式下的1月8日 |
99-Jan-08 | YMD模式中的1月8日,否则错误 |
08-Jan-99 | 1月8日,除了在YMD模式中错误 |
Jan-08-99 | 1月8日,除了在YMD模式中错误 |
19990108 | ISO 8601; 任何模式中的1999年1月8日 |
990108 | ISO 8601; 任何模式中的1999年1月8日 |
1999.008 | 年和一年中的日子 |
J2451187 | 儒略日期 |
January 8, 99 BC | 公元前99年 |
time
时间类型是time [ (p) ] without time zone和time [ (p) ] with time zone。 只写time等效于time without time zone。
db=# create table demo_time(time time);
CREATE TABLE
db=# insert into demo_time values('2020-12-23 12:09:00.000');
INSERT 0 1
db=# select * from demo_time;
time
----------
12:09:00
(1 row)
其中p,表示的毫秒域中的精度,其中在timestamp中的p也是一样的,可以取从0到6的值。
-- 如果p为1,则毫秒中显示的是1个
db=# insert into demo_time_p values('2020-12-21 12:28:00.231');
INSERT 0 1
db=# select * from demo_time_p;
time
------------
12:28:00.2
(1 row)
-- 如果p为3,则毫秒中显示的是3个
db=# create table demo_time_p3(time time(3));
CREATE TABLE
db=# insert into demo_time_p3 values('2020-12-21 12:12:00.213');
INSERT 0 1
db=# select * from demo_time_p3;
time
--------------
12:12:00.213
(1 row)
-- 如果p为4,则毫秒中显示的是4个
db=# create table demo_time_p4(time time(4));
CREATE TABLE
db=# insert into demo_time_p4 values('2020-12-21 12:12:00.21332');
INSERT 0 1
db=# select * from demo_time_p4;
time
---------------
12:12:00.2133
time可以输入的时间类型
04:05:06.789 | ISO 8601 |
---|---|
04:05:06 | ISO 8601 |
04:05 | ISO 8601 |
040506 | ISO 8601 |
04:05 AM | 和04:05一样,AM并不影响值 |
04:05 PM | 和16:05一样,输入的小时必须为 <= 12 |
04:05:06.789-8 | ISO 8601 |
04:05:06-08:00 | ISO 8601 |
04:05-08:00 | ISO 8601 |
040506-08 | ISO 8601 |
04:05:06 PST | 缩写指定的时区 |
2003-04-12 04:05:06 America/New_York | 全名指定的时区 |
时区的输入
可以采用如下
例子 | 描述 |
---|---|
PST | 缩写(太平洋标准时间) |
America/New_York | 完整时区名 |
PST8PDT | POSIX风格的时区声明 |
-8:00 | PST的ISO-8601偏移 |
-800 | PST的ISO-8601偏移 |
-8 | PST的ISO-8601偏移 |
zulu | UTC的军方缩写 |
z | zulu的短形式 |
db=# create table demo_timestamp_zone(timestamp timestamp with time zone);
CREATE TABLE
db=# insert into demo_time_zone values('12:21:00 PST');
INSERT 0 1
db=# select * from demo_time_zone;
time
-------------
12:21:00-08
(1 row)
timetz
其实就是time with time zone,用法同上面一样
timestamp
这个默认就是timestamp without time zone,就是不带时区的时间,在数据库时区发生变化的时候,这个值是不会变化的,因此要根据自己的情况进行自主的决定
db=# create table demo_timestamp(timestamp timestamp);
CREATE TABLE
db=# insert into demo_timestamp values('2020-12-21 12:12:00.213');
INSERT 0 1
db=# select * from demo_timestamp;
timestamp
-------------------------
2020-12-21 12:12:00.213
-- p为2表示精度为2
db=# create table demo_timestamp_p2(timestamp timestamp(2));
CREATE TABLE
db=# insert into demo_timestamp_p2 values('2020-12-21 12:12:00.213');
INSERT 0 1
db=# select * from demo_timestamp_p2;
timestamp
------------------------
2020-12-21 12:12:00.21
timestamptz
这个默认就是timestamp with time zone,就是带时区的时间
interval
表示时间的间隔
create table的属性语法如下
interval [ fields ] [ (p) ]
值的插入时候语法如下
[@] quantity unit [quantity unit...] [direction]
其中unit的
unit是毫秒、 millisecond、second、 minute、hour、day、 week、month、year、 decade、century、millennium 或者缩写或者这些单位的复数
其中direction可以是ago或者为空,ago对所有域求反,就是对应的值变成负数
db=# create table demo_interval(interval interval);
CREATE TABLE
db=# insert into demo_interval values('1 day');
INSERT 0 1
db=# select * from demo_interval;
interval
----------
1 day
(1 row)
db=# insert into demo_interval values('1 day 1 year');
INSERT 0 1
db=# select * from demo_interval;
interval
--------------
1 day
1 year 1 day
(2 rows)
db=# create table demo_interval(interval interval);
CREATE TABLE
db=# insert into demo_interval values('1 day ago');
INSERT 0 1
db=# select * from demo_interval;
interval
----------
-1 days
(1 row)
其中field可以为下面的,也就是说下面的就是直接指定了单位了
YEAR
MONTH
DAY
HOUR
MINUTE
SECOND
YEAR TO MONTH
DAY TO HOUR
DAY TO MINUTE
DAY TO SECOND
HOUR TO MINUTE
HOUR TO SECOND
MINUTE TO SECOND
插入时候就不用再指定了,就直接拥有单位了
db=# create table demo_interval_field(interval interval year);
CREATE TABLE
db=# insert into demo_interval_field values('2020');
INSERT 0 1
db=# select * from demo_interval_field;
interval
------------
2020 years
(1 row)
时区对时间的影响
其中timetz和time,还有timestamp和timestamptz,的区别都是时区,那么时区是怎么影响时间的,其实就是如果数据库时区发生了变化,带时区的数据显示的时候会变化,而不带时区的不会变化,在一些场景下是需要用到的,我们这里举个例子
db=# create table demo_timestamp_z(time1 timestamp, time2 timestamptz);
CREATE TABLE
db=# insert into demo_timestamp_z values (current_timestamp, current_timestamp);
INSERT 0 1
db=# select * from demo_timestamp_z;
time1 | time2
----------------------------+-------------------------------
2020-08-20 08:38:29.813405 | 2020-08-20 08:38:29.813405-07
(1 row)
其中最后的-07表示的就是我们的时区,我们查看一下我们的时区
-- 查看时区
db=# show timezone;
TimeZone
---------------------
America/Los_Angeles
(1 row)
-- 修改时区
db=# set timezone = 'Asia/Shanghai';
SET
-- 重新查看数据,发现后面的时区发生了变化
db=# select * from demo_timestamp_z;
time1 | time2
----------------------------+-------------------------------
2020-08-20 08:38:29.813405 | 2020-08-20 23:38:29.813405+08
(1 row)
时间类型的展示
风格声明 | 描述 | 例子 |
---|---|---|
ISO | ISO 8601, SQL标准 | 1997-12-17 07:37:16-08 |
SQL | 传统风格 | 12/17/1997 07:37:16.00 PST |
Postgres | 原始风格 | Wed Dec 17 07:37:16 1997 PST |
German | 地区风格 | 17.12.1997 07:37:16.00 PST |
特殊类型的输入
对于一些时间,pg也提供了一些特殊的字符就不用我们直接输入具体的时间了,比如现在的时间这种,但是只能针对一些特定的类型,如下
输入串 | 合法类型 | 描述 |
---|---|---|
epoch | date, timestamp | 1970-01-01 00:00:00+00(Unix系统时间0) |
infinity | date, timestamp | 比任何其他时间戳都晚 |
-infinity | date, timestamp | 比任何其他时间戳都早 |
now | date, time, timestamp | 当前事务的开始时间 |
today | date, timestamp | 当日午夜 |
tomorrow | date, timestamp | 明日午夜 |
yesterday | date, timestamp | 昨日午夜 |
allballs | time | 00:00:00.00 UTC |
db=# insert into demo_date values('today');
INSERT 0 1
db=# select * from demo_date;
date
------------
2020-08-20
(1 row)
db=# insert into demo_date values('tomorrow');
INSERT 0 1
db=# select * from demo_date;
date
------------
2020-08-20
2020-08-21
(2 rows)
db=# insert into demo_date values('yesterday');
INSERT 0 1
db=# select * from demo_date;
date
------------
2020-08-20
2020-08-21
2020-08-19
(3 rows)
建表的时候的后缀函数
还有就是相关的时间也可以通过一些函数进行插入使用: CURRENT_DATE、CURRENT_TIME、 CURRENT_TIMESTAMP、LOCALTIME、 LOCALTIMESTAMP
注意:
CURRENT_TIME和CURRENT_TIMESTAMP传递带有时区的值;LOCALTIME和LOCALTIMESTAMP传递的值不带时区。
db=# create table demo_date(date date);
CREATE TABLE
db=# insert into demo_date values(current_date);
INSERT 0 1
db=# select * from demo_date;
date
------------
2020-08-20
(1 row)
db=# create table demo_time(time time);
CREATE TABLE
db=# insert into demo_time values(current_time);
INSERT 0 1
db=# select * from demo_time;
time
----------------
08:26:32.71908
(1 row)
db=# create table demo_timestamp(timestamp timestamp);
CREATE TABLE
db=# insert into demo_timestamp values(current_timestamp);
INSERT 0 1
db=# select * from demo_timestamp;
timestamp
----------------------------
2020-08-20 08:27:33.615135
(1 row)
参考:
官网
http://postgres.cn/docs/11/datatype-datetime.html
其他
https://www.cnblogs.com/personblog/p/11126299.html