Postgresql 当中有四种方式获取当前时间。
一:now()
通过now()获取的时间是最完整的时间,包括时区,秒也保留到了6位小数。
select now();
得到的结果如下
'2014-12-24 09:28:31.545145+08'
二:current_timestamp效果是和now()一样的。
三:current_time
只显示当前的时间,不包括日期
select current_time;
得到的结果如下
'09:32:02.039705+08'
四:current_date
只显示当前的日期,不包括小时等信息
select current_date;
得到的结果如下
'2014-12-24'
我们还可以控制now()的返回格式,如下
select now()::timestamp(0)without time zone;(current_timestamp 是和now()一样的)
时间的计算方式,如下
select now() + interval '10 min/year/month/day/hour/sec/ (1 year 1 month 1 day 1 hour 1 min 1 sec)'
2.时间格式转换
2.1.unix时间和时间戳转换
unix时间 转 时间戳
-- unix时间戳一般是10位,如果遇到13位的情况需要除1000;
-- 末尾+1表示多1秒,例如1681574401为2023-04-16 00:00:02,也就是说两个unix时间的差值数字,表示差的秒数
select to_timestamp(1681574401);
时间戳 转 unix时间
select extract(epoch from '2023-04-16 00:00:01'::timestamp);
select extract(epoch from '2023-04-16 00:00:01'::timestamp) - 28800;
2.2.时间戳和日期转换
时间戳转日期
select '2023-04-16 00:00:01'::date;
select date('2023-04-16 00:00:01');
日期转时间戳
select '2023-04-16 00:00:01'::timestamp;
2.3.日期和文本之间转换
日期转文本:
-- 使用to_char函数
select to_char('2023-04-16'::date,'yyyymmdd');
-- 直接用文本截断
select substr('2023-04-16'::date,1,4)||substr('2023-04-16'::date,6,2)||substr('2023-04-16'::date,9,2);
文本转日期:
select '20230416'::date;
select cast('20230416' as date );
3.取日期的周、月、季、年
-- 获取年:返回2023
SELECT EXTRACT (year FROM '20230416'::date);
-- 获取季度:返回2023年2季度
SELECT (EXTRACT (year FROM '20230416'::date))||'年'||(extract (quarter FROM '20230416'::date))||'季度';
-- 获取月份:返回2023年4月
SELECT (EXTRACT (year FROM '20230416'::date))||'年'||(extract (month FROM '20230416'::date))||'月';
-- 获取周:返回14
SELECT EXTRACT (week FROM '20230416'::date);
-- 获取周中的周几:返回7
SELECT EXTRACT (isodow FROM '20230416'::date);
-- 不同日期聚合到当周周1:如下三个都返回2023-04-10
select '20230410'::date - (EXTRACT (isodow FROM '20230410'::date))::integer + 1;
select '20230414'::date - (EXTRACT (isodow FROM '20230414'::date))::integer + 1;
select '20230416'::date - (EXTRACT (isodow FROM '20230416'::date))::integer + 1;
4.相对时间获取
-- 取前1天:返回20230415
select '20230416'::date - interval '1 day';
-- 取前1周:返回20230409
select '20230416'::date - interval '1 week';
-- 取前1月:返回20230316
select '20230416'::date - interval '1 month';
-- 取前1年:返回20220416
select '20230416'::date - interval '1 month';
5.时间差计算
-- 天:返回1
select '20230416'::date - '20230415'::date;
-- 时分秒:可以转为unix时间计算