PostgreSQL中的CURRENT_TIMESTAMP::DATE和CURRENT_DATE有什么区别?

问题描述 投票:0回答:1

我创建了一个不可变函数,如下所示:

CREATE OR REPLACE   FUNCTION    GetCurrentDate ()
RETURNS
    DATE
AS
$p$
BEGIN
    RETURN  CURRENT_TIMESTAMP::DATE;
END;
$p$ LANGUAGE    plpgsql IMMUTABLE   SECURITY DEFINER;

我在 UNIQUE INDEX 的 WHERE 子句中使用它,例如:

CREATE UNIQUE INDEX PersonPhoness_UK_PhoneNo_CountryID ON person_phones (phone_no, country_id)
    WHERE   GetCurrentDate() BETWEEN effective_from_date AND effective_till_date;

添加另一条记录时,此唯一索引有时不会捕获重复项。新添加记录的 effective_from_dt 始终为 CURRENT_DATE。但是,如果我将函数更改为:

CREATE OR REPLACE   FUNCTION    GetCurrentDate ()
RETURNS
    DATE
AS
$p$
BEGIN
    RETURN  CURRENT_DATE;
END;

它有效。所以我想了解其中的区别。

plpgsql
1个回答
0
投票

第一个版本有点慢:

  1. 执行强制转换时间戳 -> 日期
  2. 将执行上下文从当前用户切换到函数所有者。上下文对
    CURRENT_TIMESTAMP
    伪函数没有任何影响,所以它是无用的。不过虽然没什么用,但是却有一个开销。也许如果函数的所有者与应用程序用户是同一用户,则上下文不会更改。但出于安全原因,这是错误的配置。

所以两个函数返回相同的结果,但首先做了一些无用的操作,然后应该会慢一点。

© www.soinside.com 2019 - 2024. All rights reserved.