原标题:深度解析:Oracle数据库SYSDATE到PostgreSQL数据库最佳转换
本文讨论了在Amazon RDS和Aurora 中使用PostgreSQL数据库时,与日期/时间相关的函数,并确定PostgreSQL数据库里的clock_timestamp函数与Oracle中的SYSDATE函数最匹配。同时我们可以自定义基于clock_timestamp的改进函数(设置迁移的Oracle数据库服务器时区),具体参考“建议”部分中所述。
作者:Baji Shaik and Sudip Acharya
来源:https://aws.amazon.com/cn/blogs/database/converting-the-sysdate-function-from-oracle-to-postgresql/
译者:多米爸比
在AWS Cloud 中迁移Oracle数据库到PostgreSQL数据库是一个复杂的过程,从最初评估阶段到迁移转换阶段,多个阶段过程中会涉及不同的技术和技能。有关迁移过程的更多信息,请参阅下面几篇文章:
Database Migration—What Do You Need to Know Before You Start?
Migration process and infrastructure considerations
Source database considerations
Target database considerations for the PostgreSQL environment
Oracle数据库迁移到Amazon RDS或者Amazon Aurora 环境下的PostgreSQL数据库时,最常见的问题之一是SYSDATE函数。应用程序或存储过程以及触发器中最常用的日期/时间函数是SYSDATE。
建表字段如creation_date,last_updated_date,approved_date,在做更新操作时会被更新为设置的默认值SYSDATE或通过触发器赋值为SYSDATE。
本文描述了在PostgreSQL数据库里替代Oracle数据库SYSDATE函数的一种方法。
在评估Oracle和PostgreSQL的日期/时间函数时,要考虑三个方面:
Statement级别或者事务级别的影响
客户端时区设置的影响
Daylight Saving Time (DST)
PostgreSQL日期/时间功能概述
PostgreSQL提供了几个函数,这些函数返回与当前日期和时间有关的值。其中一些功能是SQL标准功能,而其他功能是非SQL标准功能。
支持的SQL标准函数
以下是受支持的SQL标准函数:
CURRENT_DATE
CURRENT_TIMESTAMP/CURRENT_TIMESTAMP(precision)
CURRENT_TIME/CURRENT_TIME(precision)
LOCALTIME/LOCALTIME(precision)
LOCALTIMESTAMP/LOCALTIMESTAMP(precision)
这些函数返回当前事务的开始时间。如果您在同一事务中多次运行这些函数,则值不会更改。这是一个内部功能特性。如果要在整个事务中使用一致的时间戳,可以使用这些功能。
CURRENT_DATE
CURRENT_DATE函数以yyyy-mm-dd格式显示当前日期。请参见以下代码:
postgres=> select CURRENT_DATE;
current_date
--------------
2020-01-03
(1 row)
CURRENT_TIMESTAMP/CURRENT_TIMESTAMP(precision)CURRENT_TIME/CURRENT_TIME(precision)
这些函数返回带时区的当前日期和时间。您可以选择precision参数控制时间精度。此精度舍入小数位数(毫秒)。请参见以下代码:
postgres=> select CURRENT_TIMESTAMP;
current_timestamp
-------------------------------
2020-01-03 04:38:15.662514+00
(1 row)
postgres=> select CURRENT_TIMESTAMP(2);
current_timestamp
---------------------------
2020-01-03 04:38:19.75+00
(1 row)
postgres=> select CURRENT_TIME;
current_time
--------------------
04:40:29.409115+00
(1 row)
postgres=> select CURRENT_TIME(2);
current_time
----------------
04:40:38.01+00
(1 row)
LOCALTIME/LOCALTIME(precision)LOCALTIMESTAMP/LOCALTIMESTAMP(precision)
这些函数返回没有时区的当前日期和时间。您可以选择precision参数控制时间精度。此精度舍入小数位数(毫秒)。请参见以下代码:
postgres=> select LOCALTIMESTAMP;
localtimestamp
----------------------------
2020-01-03 04:42:39.405423
(1 row)
postgres=> select LOCALTIMESTAMP(2);
localtimestamp
------------------------
2020-01-03 04:42:41.97
(1 row)
postgres=> select LOCALTIME;
localtime
-----------------
04:42:24.022253
(1 row)
postgres=> select LOCALTIME(2);