時間類型
名字 | 描述 |
---|---|
timestamp [ (p) ] [ without time zone ] | 包括日期和時間(無時區(qū)) |
timestamp [ (p) ] with time zone | 包括日期和時間,有時區(qū) |
date | 日期(沒有一天中的時間) |
time [ (p) ] [ without time zone ] | 一天中的時間(無日期) |
time [ (p) ] with time zone | 僅僅是一天中的時間(沒有日期),帶有時區(qū) |
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 | 縮寫指定的時區(qū) |
2003-04-12 04:05:06 America/New_York | 全名指定的時區(qū) |
時區(qū)的輸入
可以采用如下
例子 | 描述 |
---|---|
PST | 縮寫(太平洋標準時間) |
America/New_York | 完整時區(qū)名 |
PST8PDT | POSIX風格的時區(qū)聲明 |
-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箩绍,就是不帶時區(qū)的時間,在數據庫時區(qū)發(fā)生變化的時候尺上,這個值是不會變化的材蛛,因此要根據自己的情況進行自主的決定
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,就是帶時區(qū)的時間<br />
interval
表示時間的間隔<br />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)
時區(qū)對時間的影響
其中timetz和time认境,還有timestamp和timestamptz胚委,的區(qū)別都是時區(qū),那么時區(qū)是怎么影響時間的元暴,其實就是如果數據庫時區(qū)發(fā)生了變化篷扩,帶時區(qū)的數據顯示的時候會變化,而不帶時區(qū)的不會變化茉盏,在一些場景下是需要用到的鉴未,我們這里舉個例子
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表示的就是我們的時區(qū)枢冤,我們查看一下我們的時區(qū)
-- 查看時區(qū)
db=# show timezone;
TimeZone
---------------------
America/Los_Angeles
(1 row)
-- 修改時區(qū)
db=# set timezone = 'Asia/Shanghai';
SET
-- 重新查看數據,發(fā)現后面的時區(qū)發(fā)生了變化
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 | 傳統(tǒng)風格 | 12/17/1997 07:37:16.00 PST |
Postgres | 原始風格 | Wed Dec 17 07:37:16 1997 PST |
German | 地區(qū)風格 | 17.12.1997 07:37:16.00 PST |
特殊類型的輸入
對于一些時間铜秆,pg也提供了一些特殊的字符就不用我們直接輸入具體的時間了淹真,比如現在的時間這種,但是只能針對一些特定的類型连茧,如下
輸入串 | 合法類型 | 描述 |
---|---|---|
epoch | date, timestamp | 1970-01-01 00:00:00+00(Unix系統(tǒng)時間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<br />
<br />注意:<br />CURRENT_TIME和CURRENT_TIMESTAMP傳遞帶有時區(qū)的值;LOCALTIME和LOCALTIMESTAMP傳遞的值不帶時區(qū)罚斗。
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)
參考:
官網<br />http://postgres.cn/docs/11/datatype-datetime.html<br />其他<br />https://www.cnblogs.com/personblog/p/11126299.html