postgresql兼容MySQL datediff函数

datediff函数兼容解决方案

datediff函数说明

datediff函数返回俩日期相差的天数,如
select datediff(‘2021-12-21 10:21:23’,now())

在postgresql中,我们使用date_part函数来返回俩日期之间的天数
date_part函数使用方法:
date_part(text,timestamp) double precision 获取子域(等效于extract);date_part(‘hour’,timestamp ‘2001-02-1620:38:40’) 20
date_part(text,interval) double precision 获取子域(等效于extract); date_part(‘month’, interval’2 years 3months’) 3

在替换数据库过程当中,我们自然是以最少改动应用代码为首,所以在数据库层面,可以做同名函数兼容。

兼容版本一:

CREATE OR REPLACE FUNCTION  datediff(p_d1 TIMESTAMP with time ZONE, p_d2 TIMESTAMP with time ZONE)
 RETURNS numeric
 LANGUAGE plpgsql
AS $function$
DECLARE
l_result   numeric;
begin        
 l_result=date_part('day',p_d1-p_d2);
--    l_result:=floor(p_d1-p_d2);        
    return   l_result;
end;
$function$;
测试:
select datediff('2021-12-21 10:21:23',now())

这样就实现了函数兼容,但是我们发现一个问题,如果是俩日期相减为小于24小时,PG返回0,而MySQL只要是隔天就会返回1。如何解决呢?我们用extract函数提取我们日期参数值中的年月天,而不要时分秒。

兼容版本二:

CREATE OR REPLACE FUNCTION  datediff(p_d1 TIMESTAMP with time ZONE, p_d2 TIMESTAMP with time ZONE)
 RETURNS numeric
 LANGUAGE plpgsql
AS $function$
DECLARE
l_result   numeric;
begin        
select extract(year from p_d1)||'-'||extract(month from p_d1)||'-'||extract(day from p_d1) into p_d1;
select extract(year from p_d2)||'-'||extract(month from p_d2)||'-'||extract(day from p_d2) into p_d2;
 l_result=date_part('day',p_d1-p_d2);
--    l_result:=floor(p_d1-p_d2);        
    return   l_result;
end;
$function$;
测试:
select datediff('2021-12-21 10:21:23',now())
select datediff('2021-1-5 20:11:23',now())

至此,函数兼容已做完。如果你觉得这篇文章对你有用,不妨点个小小的赞吧,咱们下期见~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值