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;