美文网首页postgresql
pgsql数据类型:时间类型

pgsql数据类型:时间类型

作者: 老柿子 | 来源:发表于2020-08-20 23:50 被阅读0次

    时间类型

    名字 描述
    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,就是带时区的时间<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)
    

    时区对时间的影响

    其中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<br />
    <br />注意:<br />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)
    

    参考:

    官网<br />http://postgres.cn/docs/11/datatype-datetime.html<br />其他<br />https://www.cnblogs.com/personblog/p/11126299.html

    相关文章

      网友评论

        本文标题:pgsql数据类型:时间类型

        本文链接:https://www.haomeiwen.com/subject/cpsyjktx.html