添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

PostgreSql常用的时间函数

1. 时间间隔age函数
函数描述:计算两个日期之间相隔多少天,单个参数时表示与当前日期(current_date)相比
参数:age(timestamp,timestamp),age(timestamp)
返回值:interval,两个日期之间的相隔天数
示例:
Select age(timestamp '2001-04-10', timestamp '1957-06-13')
Result: 43 years 9 mons 27 days
2. 获取当前日期和时间的关键字和函数
A. Current_date:获取当前的日期
SELECT CURRENT_DATE;
Result:2001-12-23
B. Current_time:获取当前时间
SELECT CURRENT_TIME;
Result: 14:39:53.662522-05
C. Current_tiestamp:获取当前日期和时间,开始于当前的事务
SELECT CURRENT_TIMESTAMP;
Result:2001-12-23 14:39:53.662522-05
D. LOCALTIMESTAMP: 获取当前日期和时间,开始于当前的事务
SELECT LOCALTIMESTAMP;
Result: 2001-12-23 14:39:53.662522
E. Now():获取当前日期和时间,开始于当前事务

注意点:这里的获取当前时间,日期的关键字或者函数都包含了开始于当前的事务,其含义是这个时间的获取的时刻为事务开始的时候,更重要的是在整个事务结束之前这个时间是不会变的,换句话说它在事务的过程中始终是一个值。

示例:
创建自定义函数f_test_time:
create or replace function f_test_time() returns void as $$
begin

raise notice 'time is %',now();
execute 'select pg_sleep(5)';--睡眠5秒
raise notice 'time is %',now();

end;
$$ LANGUAGE 'plpgsql';

Result:
注意:  time is 2015-04-15 10:57:17.588+08
注意:  time is 2015-04-15 10:57:17.588+08

不管两句打印语句之间的睡眠5秒的执行结果,now()函数的值是不会表,直到事务结束。
3. 获取时钟时间
clock_timestamp:获取当前的日期和时间,随着语句的执行而改变
注意点:如果想在function中知道某条sql语句的执行时间,那么需要用这个时钟函数获取时间和日期,总之只有这个函数是随着语句的执行时间实在变化的。

示例:
现将f_test_time函数中添加一条
raise notice 'clock time is %',clock_timestamp();来显示睡眠5秒是否起到了作用。
create or replace function f_test_time() returns void as $$
begin

raise notice 'time is %',now();
execute 'select pg_sleep(5)';--睡眠5秒
raise notice 'time is %',now();
raise notice 'clock time is %',clock_timestamp();
end;
$$ LANGUAGE 'plpgsql';

Result:
注意:  time is 2015-04-15 11:05:40.894+08
注意:  time is 2015-04-15 11:05:40.894+08
注意:  clock time is 2015-04-15 11:05:45.921+08
4. 截取时间
Extract:截取timestamp,存在两个重载函数,
extract(field from timestamp),
extract(field from interval)
select extract(hour from timestamp '2001-02-16 20:38:40');
Result:20
这里需要掌握的是field值的选择,不同的需求时不一样的,如:
Century:获取世纪
SELECT EXTRACT(CENTURY FROM TIMESTAMP '2015-04-15 20:38:40');
Result: 21
Day:获取timestamp中的天数和获取时间间隔中的天数
SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 16
SELECT EXTRACT(DAY FROM INTERVAL '40 days 1 minute');
Result: 40
Year:获取年
Decade:获取年的值并且除以10
Dow:获取一个星期中的第几天Sunday(0) to  Saturday(6)
Doy:一年中的第几天
Epoch:距离1970-01-01 00:00:00多少秒
Hour:获取小时数
Minute:获取分钟
Month:获取月份
Quarter:获取季度
Second:获取秒
Timezone:获取时区
Week:获取一年中第几周


还有一个类似extract的函数date_part('field', source),其field的值一样,field就是纯粹的字符串,如:
SELECT date_part('day', TIMESTAMP '2015-02-16 20:38:40');
Result: 16
SELECT date_part('hour', INTERVAL '4 hours 3 minutes');
Result: 4
5. 截断时间
date_trunc('field', source),直接看例子就明白了,
SELECT date_trunc('hour', TIMESTAMP '2001-02-16 20:38:40');
Result: 2001-02-16 20:00:00
结果显示直接将field = hour,即分和秒截断了,如果是hour那么minute和second的值就为00,如果是month那么day=1,如果是year那么month和day均为1。
6. 判断时间是否重合
OVERLAPS:返回bool值,判断两个时间间隔是否重合,只要存在重合即返回true否者返回false。两个重载的方式
(start1, end1) OVERLAPS (start2, end2)
(start1, length1) OVERLAPS (start2, length2)
第一个指start1 到end1和start2到length2两个时间段是否重合
第二个值start1开始加上length1的时间间隔与start2时间开始加上length2的时间间隔,返回两个间隔是否存在重合。

需要注意的是边界值是否被包含,遵循start <= time < end
示例:
SELECT (DATE '2015-02-16', DATE '2015-12-21') OVERLAPS
(DATE '2015-10-30', DATE '2015-10-30');
Result: true
SELECT (DATE '2001-02-16', INTERVAL '100 days') OVERLAPS
(DATE '2001-10-30', DATE '2002-10-30');
Result: false
SELECT (DATE '2001-10-29', DATE '2001-10-30') OVERLAPS
(DATE '2001-10-30', DATE '2001-10-31');
Result: false
SELECT (DATE '2001-10-30', DATE '2001-10-30') OVERLAPS
(DATE '2001-10-30', DATE '2001-10-31');
Result: true

PostgreSql常用的时间函数1. 时间间隔age函数函数描述:计算两个日期之间相隔多少天,单个参数时表示与当前日期(current_date)相比参数:age(timestamp,timestamp),age(timestamp)返回值:interval,两个日期之间的相隔天数示例:Select age(timestamp '2001-04-10', time 格式为1997-01-01 00:00:00,January 8 04:05:06 1999 PST date:日期 有1997-01-01,19970101,1/1/1997,Jan-1-1997等多种格式 time: 时间 有12:00:00,120000,12:00,8:00 AM,8:00 PM等格式 interval: 时间 间隔 格式为 1 year 2 months 3 days 4 hours 5 minutes 6 seconds post gres=# select age(timestamp '2019-01-09',timestamp '2011-03-25'); ------------------------ 7 ye...
PostgreSQL 中,可以使用 函数 date_part() 来计算两个日期之间的月份差。语法如下: date_part('month', end_date - start_date) 其中,end_date 是结束日期,start_date 是开始日期。 例如,计算2022-01-01 和 2022-03-01 之间的月份差: SELECT date_part('month', '202...
begin raise notice ' current _timestamp1:%', current _timestamp; raise notice 'clock_timestamp1:%',clock_timestamp(); raise notice 'now1:%',now(); perform pg_sleep(2); raise not 公司里有一台阿里云RDS数据库用了PPAS( Post gres PlusTM Advanced Server),在处理日期/ 时间 时遇到一些问题,花了点 时间 整理如下。 一、获取当前 时间 select now() select current _timestamp select localtimestamp select clock_timestamp() 有时候,我们不需要这么完整细致的 时间 ,自然就有 select current _date select current _time selec
在创建表的时候,有客户需要将 时间 转为字符串,而且要求了具体的格式,如:20181115101010001。方便记录数据的更新 时间 ,貌似是给Mysql使用,当时就很蛋疼, 时间 格式存储子啊数据库中就是varchar,导出来是字符串,导入到那边,是什么格式不是自动就转好了吗。但是没办法,还是得听客户的。解决办法如下: apple=# create table test_time(id i...
select CURRENT _TIMESTAMP; select CURRENT _TIME(precision); select CURRENT _TIMESTAMP(precision); select LOCALTIME; select LOCALTIMESTAMP;