前言

在理论业务开发过程中,通常会遇到对工夫日期相干的解决,这里列出一些常见的工夫日期解决办法。

1. 工夫戳带时区和不带时区

创立表字段时,指定带时区工夫日期数据类型

postgres=# CREATE TABLE tab_test(id serial,app_name varchar,app_release_date timestamp with time zone default now());    CREATE TABLE    postgres=# INSERT INTO tab_test VALUES(1,'app');    INSERT 0 1    postgres=# select * from tab_test;     id | app_name |       app_release_date            ----+----------+-------------------------------      1 | app      | 2021-10-11 15:24:05.730805+08    (1 row)

批改表字段为不带时区的数据类型

postgres=# alter table tab_test alter column app_release_date set  data type timestamp without time zone;    ALTER TABLE    postgres=# alter table tab_test alter column app_release_date set default now();    ALTER TABLE    postgres=# insert into tab_test values(2,'app2');    INSERT 0 1    postgres=# select * from tab_test;     id | app_name |      app_release_date          ----+----------+----------------------------      1 | app      | 2021-10-11 15:24:05.730805      2 | app2     | 2021-10-11 15:29:03.749597    (2 rows)

2.工夫日期函数转换为带时区和不带时区的操作

返回以后工夫戳的函数

postgres=# select current_timestamp,clock_timestamp();           current_timestamp       |        clock_timestamp            -------------------------------+-------------------------------     2021-10-11 15:39:17.720835+08 | 2021-10-11 15:39:17.720974+08    (1 row)

返回以后工夫戳函数不带时区

postgres=# select current_timestamp::timestamp without time zone,clock_timestamp()::timestamp without time zone;         current_timestamp      |      clock_timestamp           ----------------------------+----------------------------     2021-10-11 15:40:25.859267 | 2021-10-11 15:40:25.859363    (1 row)  

3.将工夫戳转换为从1970-01-01开始时的整数

将以后工夫转换为自1970-01-01开始到以后的整数

postgres=# select extract(epoch from now());     date_part         -------------------    1633938422.406166    (1 row)

下面函数 now() 是带有时区的,是否带时区和不带时区转换的整数不统一呢?

postgres=# select extract(epoch from now()),extract(epoch from now()::timestamp without time zone);     date_part     |     date_part         -------------------+-------------------    1633938525.014723 | 1633967325.014723    (1 row)

通过下面的示例,能够看出,如果将工夫戳转换为整型,带有时区和不带有时区的值是不一样的。

4.输入工夫不带精度

postgres=# select current_timestamp(0),current_time(0),localtime(0),localtimestamp(0);     current_timestamp    | current_time | localtime |   localtimestamp      ------------------------+--------------+-----------+---------------------   2021-10-11 16:00:56+08 | 16:00:56+08  | 16:00:56  | 2021-10-11 16:00:56  (1 row)

在 PostgreSQL 中,工夫戳函数和工夫函数默认保留6位精度,只须要将工夫精度保留为0即可去除精度。

5.将输入不带精度的工夫转换为整数

postgres=# select extract(epoch from current_timestamp(0)) ;   date_part    ------------   1634200047  (1 row)

7.将工夫依照工夫域进行合成

将工夫依照工夫域进行合成,有两个函数能够实现,一个是extract函数,一个是date_part函数

postgres=# select date_part('month',now()),extract('month' from now());   date_part | date_part   -----------+-----------          10 |        10  (1 row)

8.生成随机依据传入的参数生成随机日期

create or replace function random_date(date,date,integer,integer)  returns date  as  $function$  --申明随机数  declare    random_range integer;    random_days   integer;    random_start_date date;  begin    --指定随机范畴    random_range = $4 - $3;    --随机天数设置    random_days = trunc(random()*random_range);    --随机日期须要从传入参数的起始值开始    random_start_date = $1 + random_days;    if random_start_date > $2 then      raise notice '随机日期不能大于完结日期';      return $2;    else      return random_start_date;    end if;  end;      $function$  language plpgsql;  postgres=# select random_date('2001-01-02','2008-02-03',100,3000);   random_date   -------------   2006-08-03  (1 row)  postgres=# select random_date('2001-01-02','2008-02-03',100,3000);   random_date   -------------   2004-07-24  (1 row)  postgres=# select random_date('2001-01-02','2008-02-03',100,30000);  NOTICE:  随机日期不能大于完结日期   random_date   -------------   2008-02-03  (1 row)

9.测试随机日期插入数据

postgres=# create table tab_random_date(id serial,p_date date);  CREATE TABLE  postgres=# insert into tab_random_date(p_date) select random_date('2001-01-02','2008-02-03',100,id) from generate_series(1,1000) as id;  INSERT 0 1000  postgres=# select count(*),p_date from tab_random_date group by p_date;   count |   p_date     -------+------------       3 | 2002-01-23       1 | 2001-10-14       6 | 2001-01-29       1 | 2002-04-19       1 | 2002-05-17       4 | 2000-12-16