pgsql数据类型:时间类型

时间类型

名字描述
timestamp [ § ] [ without time zone ]包括日期和时间(无时区)
timestamp [ § ] with time zone包括日期和时间,有时区
date日期(没有一天中的时间)
time [ § ] [ without time zone ]一天中的时间(无日期)
time [ § ] with time zone仅仅是一天中的时间(没有日期),带有时区
interval [ fields ] [ § ]时间间隔

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-08ISO 8601; 任何模式下的1月8日 (推荐格式)
January 8, 1999在任何datestyle输入模式下都无歧义
1/8/1999MDY模式中的1月8日;DMY模式中的8月1日
1/18/1999MDY模式中的1月18日;在其他模式中被拒绝
01/02/03MDY模式中的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-08YMD模式中的1月8日,否则错误
08-Jan-991月8日,除了在YMD模式中错误
Jan-08-991月8日,除了在YMD模式中错误
19990108ISO 8601; 任何模式中的1999年1月8日
990108ISO 8601; 任何模式中的1999年1月8日
1999.008年和一年中的日子
J2451187儒略日期
January 8, 99 BC公元前99年

time

时间类型是time [ § ] without time zone和time [ § ] 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.789ISO 8601
04:05:06ISO 8601
04:05ISO 8601
040506ISO 8601
04:05 AM和04:05一样,AM并不影响值
04:05 PM和16:05一样,输入的小时必须为 <= 12
04:05:06.789-8ISO 8601
04:05:06-08:00ISO 8601
04:05-08:00ISO 8601
040506-08ISO 8601
04:05:06 PST缩写指定的时区
2003-04-12 04:05:06 America/New_York全名指定的时区
时区的输入

可以采用如下

例子描述
PST缩写(太平洋标准时间)
America/New_York完整时区名
PST8PDTPOSIX风格的时区声明
-8:00PST的ISO-8601偏移
-800PST的ISO-8601偏移
-8PST的ISO-8601偏移
zuluUTC的军方缩写
zzulu的短形式
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 ] [ § ]

值的插入时候语法如下

[@] 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)

时间类型的展示

风格声明描述例子
ISOISO 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也提供了一些特殊的字符就不用我们直接输入具体的时间了,比如现在的时间这种,但是只能针对一些特定的类型,如下

输入串合法类型描述
epochdate, timestamp1970-01-01 00:00:00+00(Unix系统时间0)
infinitydate, timestamp比任何其他时间戳都晚
-infinitydate, timestamp比任何其他时间戳都早
nowdate, time, timestamp当前事务的开始时间
todaydate, timestamp当日午夜
tomorrowdate, timestamp明日午夜
yesterdaydate, timestamp昨日午夜
allballstime00: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

  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pgsql中,时间类型的比较可以使用比较运算符(如<、>、=)来进行。比较的结果是根据时间的先后顺序来确定的。例如,如果要比较两个时间值的大小,可以使用以下语法: ```sql SELECT time1 < time2 FROM table_name; ``` 其中,time1和time2是要比较的两个时间值,table_name是包含这两个时间值的表名。比较的结果将返回一个布尔值,表示time1是否小于time2。 另外,还可以使用其他比较运算符(如<=、>=、<>)来进行更复杂的比较操作。需要注意的是,比较运算符在比较时间类型时会考虑时区的影响。如果时间值带有时区信息,则比较时会将其转换为统一的时区进行比较。 需要注意的是,pgsql中还提供了一些函数来进行时间类型的比较,如age()函数可以计算两个时间值之间的时间间隔。可以根据具体的需求选择合适的比较方法。 参考资料: \[1\] 时间类型time \[ § \] without time zonetime \[ § \] with time zone。 只写time等效于time without time zone。\[2\] 还有就是相关的时间也可以通过一些函数进行插入使用: CURRENT_DATE、CURRENT_TIME、 CURRENT_TIMESTAMP、LOCALTIME、 LOCALTIMESTAMP 注意:CURRENT_TIME和CURRENT_TIMESTAMP传递带有时区的值;LOCALTIME和LOCALTIMESTAMP传递的值不带时区。\[3\] 其中最后的-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) 时间类型的展示 风格声明描述例子ISOISO 8601, SQL标准1997-12-17 07:37:16-08SQL传统风格12/17/1997 07:37:16.00 PSTPostgres原始风格Wed Dec 17 07:37:16 1997 PSTGerman地区风格17.12.1997 07:37:16.00 PST 特殊类型的输入。 #### 引用[.reference_title] - *1* *2* *3* [pgsql数据类型时间类型](https://blog.csdn.net/zhouzhenyong/article/details/108137913)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值