PostgreSQL时间函数和操作符

日期/时间操作符

下表演示了基本算术操作符的行为(+,*, 等):

  1. 小时转换成秒
select date_part('epoch', justify_interval(interval '24 hours'))
date_part
86400
  1. 时间加法
SELECT now() + INTERVAL '1 month';
CURRENT_DATE - INTERVAL'1 day'
?column?
2024-01-15 04:49:17.712491+08
  1. 秒换算成小时
SELECT justify_hours(interval '2592000 sec')
justify_hours
30 days
  1. 当前日志换算成时间戳
select EXTRACT(epoch FROM CAST(CURRENT_DATE AS TIMESTAMPTZ))::INTEGER;
extract
1702569600
  1. 将时间戳转换成时间
select to_char(to_timestamp(1702512000), 'yyyy-mm-dd hh24:mi:ss')
to_char
2023/12/14 8:00
  1. 获取昨天00:00:00时间节点
SELECT CURRENT_DATE - INTERVAL'1 day'
?column?
2023/12/14 0:00
  1. 将今天的2023-12-18 23:59:00转换成时间戳
select EXTRACT(epoch FROM CAST(to_char(CURRENT_DATE - INTERVAL'0 day' + TIME'23:59', 'yyyy-mm-dd hh24:mi:ss') AS TIMESTAMPTZ))::INTEGER
extract
1702655940

8.其他时间例子

操作符例子结果
+date ‘2001-09-28’ + integer ‘7’date ‘2001-10-05’
+date ‘2001-09-28’ + interval ‘1 hour’timestamp ‘2001-09-28 01:00:00’
+date ‘2001-09-28’ + time ‘03:00’timestamp ‘2001-09-28 03:00:00’
+interval ‘1 day’ + interval ‘1 hour’interval ‘1 day 01:00:00’
+timestamp ‘2001-09-28 01:00’ + interval ‘23 hours’timestamp ‘2001-09-29 00:00:00’
+time ‘01:00’ + interval ‘3 hours’time ‘04:00:00’
-- interval ‘23 hours’interval ‘-23:00:00’
-date ‘2001-10-01’ - date ‘2001-09-28’integer ‘3’ (days)
-date ‘2001-10-01’ - integer ‘7’date ‘2001-09-24’
-date ‘2001-09-28’ - interval ‘1 hour’timestamp ‘2001-09-27 23:00:00’
-time ‘05:00’ - time ‘03:00’interval ‘02:00:00’
-time ‘05:00’ - interval ‘2 hours’time ‘03:00:00’
-timestamp ‘2001-09-28 23:00’ - interval ‘23 hours’timestamp ‘2001-09-28 00:00:00’
-interval ‘1 day’ - interval ‘1 hour’interval ‘1 day -01:00:00’
-timestamp ‘2001-09-29 03:00’ - timestamp ‘2001-09-27 12:00’interval ‘1 day 15:00:00’
*900 * interval ‘1 second’interval ‘00:15:00’
*21 * interval ‘1 day’interval ‘21 days’
*double precision ‘3.5’ * interval ‘1 hour’interval ‘03:30:00’
/interval ‘1 hour’ / double precision ‘1.5’interval ‘00:40:00’

日期/时间函数

函数返回类型描述例子结果
age(timestamp, timestamp)interval减去参数后的"符号化"结果,使用年和月,不只是使用天age(timestamp ‘2001-04-10’, timestamp ‘1957-06-13’)43 years 9 mons 27 days
age(timestamp)intervalcurrent_date减去参数后的结果(在午夜)age(timestamp ‘1957-06-13’)43 years 8 mons 3 days
clock_timestamp()timestamp with time zone实时时钟的当前时间戳(在语句执行时变化)
current_datedate当前的日期;
current_timetime with time zone当日时间;
current_timestamptimestamp with time zone当前事务开始时的时间戳;
date_part(text, timestamp)double precision获取子域(等效于extract);date_part(‘hour’, timestamp ‘2001-02-16 20:38:40’)20
date_part(text, interval)double precision获取子域(等效于extract);date_part(‘month’, interval ‘2 years 3 months’)3
date_trunc(text, timestamp)timestamp截断成指定的精度;date_trunc(‘hour’, timestamp ‘2001-02-16 20:38:40’)2001-02-16 20:00:00
date_trunc(text, interval)interval截取指定的精度,date_trunc(‘hour’, interval ‘2 days 3 hours 40 minutes’)2 days 03:00:00
extract(field from timestamp)double precision获取子域;extract(hour from timestamp ‘2001-02-16 20:38:40’)20
extract(field from interval)double precision获取子域;extract(month from interval ‘2 years 3 months’)3
isfinite(date)boolean测试是否为有穷日期(不是 +/-无穷)isfinite(date ‘2001-02-16’)true
isfinite(timestamp)boolean测试是否为有穷时间戳(不是 +/-无穷)isfinite(timestamp ‘2001-02-16 21:28:30’)true
isfinite(interval)boolean测试是否为有穷时间间隔isfinite(interval ‘4 hours’)true
justify_days(interval)interval按照每月 30 天调整时间间隔justify_days(interval ‘35 days’)1 mon 5 days
justify_hours(interval)interval按照每天 24 小时调整时间间隔justify_hours(interval ‘27 hours’)1 day 03:00:00
justify_interval(interval)interval使用justify_daysjustify_hours调整时间间隔的同时进行正负号调整justify_interval(interval ‘1 mon -1 hour’)29 days 23:00:00
localtimetime当日时间;
localtimestamptimestamp当前事务开始时的时间戳;
make_date(year int, month int, day int)date为年、月和日字段创建日期make_date(2013, 7, 15)2013-07-15
make_interval(years int DEFAULT 0, months int DEFAULT 0, weeks int DEFAULT 0, days int DEFAULT 0, hours int DEFAULT 0, mins int DEFAULT 0, secs double precision DEFAULT 0.0)interval从年、月、周、天、小时、分钟和秒字段中创建间隔make_interval(days := 10)10 days
make_time(hour int, min int, sec double precision)time从小时、分钟和秒字段中创建时间make_time(8, 15, 23.5)08:15:23.5
make_timestamp(year int, month int, day int, hour int, min int, sec double precision)timestamp从年、月、日、小时、分钟和秒字段中创建时间戳make_timestamp(2013, 7, 15, 8, 15, 23.5)2013-07-15 08:15:23.5
make_timestamptz(year int, month int, day int, hour int, min int, sec double precision, [ timezone text ])timestamp with time zone从年、月、日、小时、分钟和秒字段中创建带有时区的时间戳。 没有指定timezone时,使用当前的时区。make_timestamptz(2013, 7, 15, 8, 15, 23.5)2013-07-15 08:15:23.5+01
now()timestamp with time zone当前事务开始时的时间戳;
statement_timestamp()timestamp with time zone实时时钟的当前时间戳;
timeofday()textclock_timestamp相同,但结果是一个text 字符串;
transaction_timestamp()timestamp with time zone当前事务开始时的时间戳;
  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NoYoWiFi

感谢大佬赐赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值