PG日期类型系列之日期运算

目录

获取当前日期、时间

日期运算

interval进行日期加减

日期、时间函数


获取当前日期、时间

获取当前日期

SELECT now();

SELECT  current_timestamp

两者的结果区别:now保留小数点后6位,current_timestamp留小数点后5位

获取当前时间

 select localtime::time(0) as time; 
 select CURRENT_TIME ::time(0) as time;

注:date类型是没有精度一说的(年月日),只有time和timestamp才有精度(秒后面有小数)

日期运算

日期加法 

select now()::timestamp(0)+'1year' as nextyear ;
 select now()::timestamp(0)+'1month' as nextmonth ;
 select now()::timestamp(0)+'1day' as nextday ;
 select now()::timestamp(0)+'1hour' as nexthour ;
 select now()::timestamp(0)+'1minute' as nextminute ;
 select now()::timestamp(0)+'1second' as nextsecond ;
日期减法
 select now()::timestamp(0)+'-1year' as lastyear ;
 select now()::timestamp(0)+'-1month' as lastmonth ;
 select now()::timestamp(0)+'-1day' as lastday ;
 select now()::timestamp(0)+'-1hour' as lasthour ;
 select now()::timestamp(0)+'-1minute' as lastminute ;
 select now()::timestamp(0)+'-1second' as lastsecond ;
注:日期减法时只能改变字符串中的数字为负数才生效
如果如下写法则是错误的select now()::timestamp(0)-'1second' as lastsecond ;

混合运算
 select now()::timestamp(0)+'1year 1 month 1day 1hour 1minute' as next ;
 select now()::timestamp(0)+'-1year 1 month 1day 1hour 1minute' as last;

interval进行日期加减

 使用interval进行日期加法
select to_date('2022-06-01','yyyy-mm-dd')  + interval  '1year' nextyear;
select to_date('2022-06-01','yyyy-mm-dd')  + interval  '1month' nextmonth;
select to_date('2022-06-01','yyyy-mm-dd')  + interval  '1day' nextday;
select to_date('2022-06-01','yyyy-mm-dd')  + interval  '1hour' nexthour;
select to_date('2022-06-01','yyyy-mm-dd')  + interval  '1minute' nextminute;
select to_date('2022-06-01','yyyy-mm-dd')  + interval  '1second' nextsecond;

使用interval进行日期减法
select to_date('2022-06-01','yyyy-mm-dd')+interval'-1year' lastyear;
select to_date('2022-06-01','yyyy-mm-dd')+ interval'-1month' lastmonth;
select to_date('2022-06-01','yyyy-mm-dd')+ interval'-1day' lastday;
select to_date('2022-06-01','yyyy-mm-dd')+ interval'-1hour' lasthour;
select to_date('2022-06-01','yyyy-mm-dd')+ interval'-1minute' lastminute;
select to_date('2022-06-01','yyyy-mm-dd')+ interval'-1second' lastsecond;

日期精度

Name Storage Size Description Low Value High Value Resolution
timestamp [ (p) ] [ without time zone ] 8 bytes both date and time (no time zone) 4713 BC 294276 AD 1 microsecond / 14 digits
timestamp [ (p) ] with time zone 8 bytes both date and time, with time zone 4713 BC 294276 AD 1 microsecond / 14 digits
date 4 bytes date (no time of day) 4713 BC 5874897 AD 1 day
time [ (p) ] [ without time zone ] 8 bytes time of day (no date) 00:00:00 24:00:00 1 microsecond / 14 digits
time [ (p) ] with time zone 12 bytes times of day only, with time zone 00:00:00+1459 24:00:00-1459 1 microsecond / 14 digits
interval [ fields ] [ (p) ] 12 bytes time interval -178000000 years 178000000 years 1 microsecond / 14 digits

日期、时间函数

函数 实例 结果 描述
age(timestamp,timestamp) select age(timestamp '2022-06-02',timestamp '2000-06-01') as birthday; 22 years 1 day 获取两个日期相差多少 xxx years xx mons xx days 格式
age(timestamp) select age(timestamp '2000-06-02:00:00:00') as birthday 21 years 11 mons 29 days 距离当前日期的时间差xxx years xx mons xx days 格式
date_part(text, timestamp)获取子域(等效于extract) select date_part('hour', timestamp '2001-02-16 20:38:40') select date_part('month', interval '2 years 3 months') 从日期中提取指定域
extract(field from timestamp) select extract(year from timestamp '2022-02-16 20:38:40') 2022 从日期中提取指定域见【1】

注:extract函数用于从一个日期中获取某个子集,比如获取年,月,日,时,分,秒

EPOCH对于日期和时间戳类型的值,会获取到两个日期或者时间戳参数的时间之间相隔的秒数。

SELECT EXTRACT('EPOCH' FROM (TIMESTAMP '2022-02-18 16:50:27'- TIMESTAMP '2022-02-18 16:49:23'));   
​
SELECT EXTRACT('SECOND' FROM (TIMESTAMP '2022-02-18 16:50:27'- TIMESTAMP '2022-02-18 16:49:23'));  

你可能感兴趣的:(数据库,sql,数据库,database)