PG迁移必读(十二): 复现Sybase Datediff函数
Barry Chen

前言:PG中没有类似Sybase的datediff函数。AWS SCT工具在转换该函数时,会生成复杂且错误的代码。本文实现了一个调用方式与原Sybase datediff一致的函数,并对其进行了扩展。使用本函数可以有效简化代码,并提升开发效率。

AWS SCT错误的转换

原Sybase代码:

转换后的PG代码:

显然,转换后的逻辑是错误的。

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转出的计算年龄的错误代码:

 

可使用本函数直接替换为:
 

 

简单明了。

结论:通过上述代码,我们成功地将 Sybase 的 datediff 函数移植到了 PostgreSQL。这个函数可以根据指定的模式(如秒、分钟、小时、天、月、年)计算两个时间戳之间的差异。利用本函数不仅可提升代码质量,同时也提升了开发效率。