pgsql 函数

SQL的一些用’0’补全字段的函数方法在GP库里面是不适用的

1.左补’0’函数:
Lpad(‘A’,B,‘0’)
试例:select Ipad(dingdan,8,‘0’)
注释:当dingdan这个字段不满8位时,左边自动补全0,使其达到8位长度,如A为字段则不需加单引,数值的话则需要加上单引
2.右补’0’函数
Rpad(‘A’,B,‘0’)
与Ipad()函数用法一致,不过多解释

3.去掉前缀’0’
ltrim函数
用法:
ltrim(‘0000150’,‘0’)
效果:

4.去掉后缀’0’
rtrim函数
用法:
select rtrim(‘150000000’, ‘0’)

PostgreSQL 中的时间类型包括:

  1. date:表示日期,格式为 yyyy-mm-dd。

  2. time:表示时间,格式为 hh:mm:ss。

  3. timestamp:表示日期和时间,格式为 yyyy-mm-dd hh:mm:ss。

  4. interval:表示时间间隔,格式为 ‘1 day 1 hour’.

  5. timestamptz:表示带有时区的日期和时间,格式为 yyyy-mm-dd hh:mm:ss TZ。

对于时间类型的格式化,可以使用 TO_CHAR 函数。例如:

  1. TO_CHAR(date_field, ‘YYYY/MM/DD’) 将 date_field 转换成 yyyy/mm/dd 的形式。

  2. TO_CHAR(time_field, ‘HH12:MI:SS AM’) 将 time_field 转换成 hh:mm:ss AM/PM 的形式。

  3. TO_CHAR(timestamp_field, ‘YYYY-MM-DD HH24:MI:SS’) 将 timestamp_field 转换成 yyyy-mm-dd hh:mm:ss 的形式。

  4. TO_CHAR(interval_field, ‘HH24:MI’) 将 interval_field 转换成 hh:mm 的形式。

  5. TO_CHAR(timestamptz_field, ‘YYYY-MM-DD HH:MI:SS TZ’) 将 timestamptz_field 转换成 yyyy-mm-dd hh:mm:ss TZ 的形式。

除了 TO_CHAR 函数外,也可以使用 CAST 函数将时间类型转换成字符串类型,并自定义格式。例如:

  1. CAST(date_field AS text) 将 date_field 转换成字符串类型,在使用字符串格式化函数进行格式化。

  2. CAST(time_field AS text) 将 time_field 转换成字符串类型,在使用字符串格式化函数进行格式化。

  3. CAST(timestamp_field AS text) 将 timestamp_field 转换成字符串类型,在使用字符串格式化函数进行格式化。

  4. CAST(interval_field AS text) 将 interval_field 转换成字符串类型,在使用字符串格式化函数进行格式化。

  5. CAST(timestamptz_field AS text) 将 timestamptz_field 转换成字符串类型,在使用字符串格式化函数进行格式化。

需要注意的是,字符串格式化函数的参数与标准格式化字符串有所差别,请参考 PostgreSQL 文档进行使用。

1.首先系统默认的四个函数,前两个是日期+时间,后面的是单独日期函数与单独时间。

–标准时间函数
select now();
2022-01-04 10:31:26.435501+08
–标准时间函数,同now()
select current_timestamp;
2022-01-04 10:31:33.679012+08
–标准日期
select current_date;
2022-01-04
–标准时间
select current_time;
10:31:47.180718+08
2.时间上的计算。这里是可以根据当前时间计算下个月,下周的时间等等,个人喜欢用current_date(纯日期,看着舒服),计算时间加减,注意关键字interval(间隔的意思),但是用now时可以不加!!!

–当前日期 + 一天
select current_date,current_date + interval ‘1 day’;
2022-01-04 2022-01-05 00:00:00
–当前日期 + 一周
select current_date,current_date + interval ‘1 week’;
2022-01-04 2022-01-11 00:00:00
–当前日期 + 一月
select current_date,current_date + interval ‘1 month’;
2022-01-04 2022-02-04 00:00:00
–当前日期 + 一年
select current_date,current_date + interval ‘1 year’;
2022-01-04 2023-01-04 00:00:00

–用now,当前时间 + 1天,其他同理
select now(),now() + interval ‘1 day’;
2022-01-04 10:43:14.587596+08 2022-01-04 10:43:14.587596+08
select now(),now() + ’ 1 year’;
2022-01-04 10:43:14.587596+08 2023-01-04 10:43:14.587596+08
PS:强大的包容性,计算时间可以用另外两种表达,而且时间还忽略了大小写,很赞!!

时间 标准 简写 单数
年 Years Y year
月 Months M Month
周 Weeks W Week
天 Days D Day
小时 Hours H Hour
分钟 Minutes M Minute
秒 Seconds S Second

select current_time,current_time + interval ‘1 hours’;
10:36:49.929987+08 11:36:49.929987+08
select current_time,current_time + interval ‘1 Minutes’,current_time + interval ‘1 MinUte’;
10:37:16.843502+08 10:38:16.843502+08 10:38:16.843502+08
3.时间函数的进阶,经常会遇到查询上月末的某天,或者每天的2点20分等等~

–当前日期,本年第一天,上一年最后一天
select current_date,date_trunc(‘year’, current_date), date_trunc(‘year’, current_date) - interval ‘1 day’;
2022-01-04 2022-01-01 00:00:00+08 2021-12-31 00:00:00+08
–当前日期,当月第一天,上月最后一天
select current_date,date_trunc(‘month’, current_date), date_trunc(‘month’, current_date) - interval ‘1 day’;
2022-01-04 2022-01-01 00:00:00+08 2021-12-31 00:00:00+08
–当前日期,今天2点20
select current_date,current_date + interval ‘2 hour’ + interval ‘20 M’;
2022-01-04 2022-01-04 02:20:00
4.基本技能,时间转为字符串

select to_char(now(),‘YYYY-MM-DD HH24:MI:SS’),To_char(now(),‘yyyy-mm-dd hh24:mi:ss’);
2022-01-04 11:14:39 2022-01-04 11:14:39
select to_char(current_timestamp,‘YYYY-MM-DD HH24:MI:SS’),to_char(current_timestamp,‘HH24:MI:SS’);
2022-01-04 11:14:50 11:14:50
select to_char(current_date,‘YYYY-MM-DD HH24:MI:SS’);
2022-01-04 00:00:00

获取当前系统时间
select now();
select current_timestamp;
结果:2020-11-04 16:09:53.247825+08
1
2
3
获取当前日期或时间
select current_date;
结果:2020-11-04
1
2
select current_time;
结果:16:14:08.501182+08
1
2
查询昨天的数据
select
DISTINCT count(id)
from
表名
where coalesce(l.join_date,l.sys_createdate) >= current_date - 1;

这里的coalesce函数,语法:coalesce(expr1,expr2,expr3…)

如果第一个字段存在就用第一个进行表达式判断;

如果第一个不存在为null则用第二个进行表达式判断;

如果都没有null则返回null

1
2
3
4
5
6
7
8
9
10
查询某个时间的周一
SELECT ( DATE ‘2020-10-23’ - INTERVAL ‘1 day’ - ( EXTRACT ( dow FROM ( DATE’2020-10-23’ - INTERVAL ‘1 day’ ) ) - 1 || ’ day’ ) :: INTERVAL ) :: DATE;

减1 是因为得到的是以周一是星期的开始

1
2
查询本周的数据
SELECT( DATE ( now() ) - ( EXTRACT ( dow FROM DATE ( now() ) ) - 1 || ’ day’ ) :: INTERVAL ) :: DATE startasy,
( DATE ( now() ) - ( EXTRACT ( dow FROM DATE ( now() ) ) - 1 || ’ day’ ) :: INTERVAL ) :: DATE + 6 endday
from 表名 LIMIT 1;
1
2
3
本周最后一天
SELECT to_char(CURRENT_DATE +cast(-1*(TO_NUMBER(to_char(CURRENT_DATE,‘D’),‘99’)-2) + 6 ||’ days’ as interval),‘yyyy-mm-dd’);

加6天就表示是周日 不加就是本周的第一天

1
2
本月,方式一
select to_char((SELECT now() as timestamp),‘mm’);
1
本月,方式二
select * from 表名 where time >= date_trunc( ‘month’, now() );
1
获取上月
select to_char((select now() - interval ‘1 month’),‘mm’);
1
获取今年
select to_char((SELECT now() as timestamp),‘yyyy’)
1
获取去年
select to_char((select now() - interval ‘1 years’),‘yyyy’)
1
(补充)获取过去12个月或者今年月份的数据
WITH RECURSIVE T (n) AS (
SELECT DATE(to_char( to_date(‘2022-08’, ‘yyyy-MM-dd’) - INTERVAL ‘11 month’, ‘yyyy-MM-dd’ ))
UNION ALL
SELECT
n + 1
FROM
T
WHERE
n < DATE( to_char( to_date(‘2022-08’, ‘yyyy-MM-dd’), ‘yyyy-MM-dd’ ) )
) SELECT
to_char( n, ‘yyyy-MM’ ) AS MONTH
FROM T
GROUP BY
MONTH ORDER BY Month

只要月份修改成2022-12就表示查询今年内的所有月份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(补充)获取过去一个月内的所有天的数据
WITH RECURSIVE T ( n ) AS (
SELECT DATE
( to_char( now( ) - INTERVAL ‘30 day’, ‘yyyy-MM-dd’ ) ) UNION ALL
SELECT
n + 1
FROM
T
WHERE
n < DATE ( to_char( now( ), ‘yyyy-MM-dd’ ) )
) SELECT
to_char( n, ‘yyyy-MM-dd’ ) AS DAYS
FROM T
GROUP BY
DAYS
ORDER BY DAYS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(补充)获取上个月每天的数据(1号-31号)
SELECT
generate_series (
date_trunc( ‘month’, CURRENT_DATE - interval ‘1 month’),
date_trunc( ‘month’, CURRENT_DATE) - interval ‘1 day’,
‘1 d’ :: INTERVAL
) :: DATE days
1
2
3
4
5
6
(补充)获取本月每天的数据(1号-31号)
SELECT
generate_series (
date_trunc( ‘month’, CURRENT_DATE),
date_trunc( ‘month’, CURRENT_DATE) + ‘1 month -1d’,
‘1 d’ :: INTERVAL
) :: DATE days
1
2
3
4
5
6
获取时间之间的秒差
SELECT round(date_part(‘epoch’, TIMESTAMP ‘2022-08-15 17:00:10’ - TIMESTAMP ‘2022-08-15 17:00:00’));
结果:10
1
2
获取时间之间的分钟差
SELECT round(date_part(‘epoch’, TIMESTAMP ‘2022-08-15 17:10:10’ - TIMESTAMP ‘2022-08-15 17:00:00’)/60);
结果:10
1
2
获取时间之间的小时差
SELECT round(date_part(‘epoch’, TIMESTAMP ‘2022-08-15 19:10:10’ - TIMESTAMP ‘2022-08-15 17:00:00’)/60/60);
结果:2

猜你喜欢

转载自blog.csdn.net/weixin_45163291/article/details/132084731