前言:PG中没有类似Sybase的datediff函数。AWS SCT工具在转换该函数时,会生成复杂且错误的代码。本文实现了一个调用方式与原Sybase datediff一致的函数,并对其进行了扩展。使用本函数可以有效简化代码,并提升开发效率。
AWS SCT错误的转换
原Sybase代码:
--复现datediff函数/626717157.png)
转换后的PG代码:
--复现datediff函数/1202684512.png)
显然,转换后的逻辑是错误的。
Datediff的PG实现
CREATE OR REPLACE function datediff( mode varchar, par_start timestamp, par_end timestamp )
returns int
LANGUAGE plpgsql
As $$
declare var_value int;
Begin
var_value:=case mode
when 'ss' then
(DATE_PART ('epoch', par_end ) - DATE_PART ('epoch', par_start ) )
when 'mi' then
FLOOR(DATE_PART ('epoch', par_end ) - DATE_PART ('epoch', par_start ) ) / 60
when 'hh' then
FLOOR(DATE_PART ('epoch', par_end ) - DATE_PART ('epoch', par_start ) ) / 3600
when 'dd' then
FLOOR(DATE_PART ('epoch', par_end ) - DATE_PART ('epoch', par_start ) ) / 3600 /24
when 'mm' then
12 * (DATE_PART('year', par_end) - DATE_PART('year', par_start)) +
DATE_PART ('month', par_end) - DATE_PART ('month', par_start)
when 'yy' then
DATE_PART( 'year', par_end) - DATE_PART( 'year', par_start)
when 'age' then
extract( year from age( par_end, par_start ) )
ELSE
NULL
END;
IF var_value IS NULL then
RAISE EXCEPTION 'Mode "%" is not implemented yet!', MODE;
END IF;
RETURN var_value;
END; $$;
经测试,本代码与Sybase datediff函数输出一致。
具体应用
以下是AWS SCT转出的计算年龄的错误代码:
--复现datediff函数/1846538680.png)
可使用本函数直接替换为:
--复现datediff函数/3699051002.png)
简单明了。
结论:通过上述代码,我们成功地将 Sybase 的 datediff 函数移植到了 PostgreSQL。这个函数可以根据指定的模式(如秒、分钟、小时、天、月、年)计算两个时间戳之间的差异。利用本函数不仅可提升代码质量,同时也提升了开发效率。