在PostgreSQL中的”当前日期时间”
现在有很多不同的表达方式来表示日期和时间。
我在PostgreSQL 13的日文文档中注意到了9.9.4部分,该部分是关于观察当前日期/时间的内容,我将其记录下来。
在PostgreSQL中存在多种表示当前日期和时间的表达方式。
当前日期,当前时间,当前时间戳,本地时间,本地时间戳
SELECT
CURRENT_DATE,
CURRENT_TIME,
CURRENT_TIMESTAMP,
CURRENT_TIME(1),
CURRENT_TIMESTAMP(1),
LOCALTIME,
LOCALTIMESTAMP,
LOCALTIME(1),
LOCALTIMESTAMP(1)
在这个处理系统中,虽然提供了精确到秒以下6位的功能,但可以通过指定精度来进行四舍五入处理。附加的”+09″表示带有时区信息。
获取交易时间戳(), 获取语句时间戳(), 获取系统时间戳(), 获取时间和日期信息(), 获取当前时间()
我将全部引用说明如下:
transaction_timestamp()(交易时间戳)与CURRENT_TIMESTAMP(当前时间戳)等价,但其名称反映了其明确返回的内容。
statement_timestamp()(语句时间戳)返回当前语句的执行开始时间(更具体地说,是接收到来自客户端的前一个命令消息的时间)。statement_timestamp()和transaction_timestamp()在事务的第一个命令中返回相同的值,但在随后的命令中可能会有不同的值。
clock_timestamp()(时钟时间戳)返回实际当前时间,因此即使在单个SQL命令中也可能不同。
timeofday()(时间之日)是PostgreSQL的历史函数。类似于clock_timestamp(),它返回实际当前时间,但不是timestamp with time zone(带有时区的时间戳)类型的值,而是格式化的文本字符串。
now()(当前时间)与transaction_timestamp()(交易时间戳)相同,是传统的PostgreSQL函数。
SELECT
transaction_timestamp(), statement_timestamp(), clock_timestamp(), timeofday(), now()
;
如果单独执行这个SELECT语句,意义并不太大,正如说明所述,只有在事务处理中使用它时,才会带来各种差异。
思考如何使用
如果想记录执行INSERT或UPDATE语句的实际时间(例如create_at或update_at等),使用transaction_timestamp()和clock_timestamp()哪个更好呢?我认为这取决于思考方式,但如果将一系列数据更新处理视为一个整体,则认为使用transaction_timestamp()更合理。在跨多个表的长时间处理中,保证起始时间和结束时间一致的是transaction_timestamp()。另一方面,如果注重实际时间,则可能会选择clock_timestamp()。它也可以用于测量特定查询的处理时间。