如何在postgres函数中设置时区

时间:2017-07-16 07:32:24

标签: postgresql function stored-procedures plpgsql

CREATE OR REPLACE FUNCTION myfunction(userid BIGINT)
  RETURNS REAL
  SECURITY DEFINER
LANGUAGE plpgsql
AS $$
DECLARE
  ------------------------Fetch all Active Games for a user and add it to one cursor--------------------------------------
    PersonGames NO SCROLL CURSOR FOR select timezonename from user where id=userid;
BEGIN
  OPEN PersonGames;
  LOOP

    FETCH PersonGames INTO PersonGame;
    IF NOT found
    THEN
      EXIT;
    END IF;
    SET TIMEZONE=PersonGame.timezonename;
  --  execute 'set TIMEZONE=$1' using PersonGame.timezonename;
end loop;
END;
$$;

我收到参数“TimeZone”的错误无效值:“timezonename”

即使我尝试使用PersonGame.timezonename更改代码执行'set TIMEZONE = $ 1';

但这也行不通。

我想在我的函数中设置时区。

任何帮助都非常感激。

谢谢

1 个答案:

答案 0 :(得分:2)

您可以通过两种不同的方式完成这项工作:

  1. 您可以使用EXECUTE命令,使用完全构造的字符串(即:没有USING 1 ),并使用SET [LOCAL] TIME ZONE声明,正如你在函数中所做的那样。

    此功能可让您测试它:

    CREATE OR REPLACE FUNCTION test_set_time_zone(_new_time_zone TEXT)
       RETURNS TEXT
       SECURITY DEFINER
       LANGUAGE plpgsql
    AS $$
    BEGIN
        EXECUTE 'SET LOCAL TIME ZONE ''' || _new_time_zone || ''';' ;
        RETURN current_setting('timezone')  ;
    END;
    $$;
    

    您可以查看:

    SELECT test_set_time_zone('Europe/Paris');
    
    | test_set_time_zone |
    | :----------------- |
    | Europe/Paris       |
    
  2. 您可以以类似方式使用set_config()功能,通过PERFORM调用,将'timezone'设置为要配置的参数,并决定是否进行设置{ {1}}或local

    您可以查看:

    global
    | test_set_time_zone_2 |
    | :------------------- |
    | US/Central           |
    
  3. 你可以在 dbfiddle here 检查这两个功能我没有尝试任何全局设置,因为我的猜测是在这个平台上,网络用户不会拥有适当的特权;我最好的猜测是你可以在你的系统做全局变化做同等的事情。

    1) 根据来自 Pavel Stehule的评论CREATE OR REPLACE FUNCTION test_set_time_zone_2 (_new_time_zone TEXT) RETURNS TEXT SECURITY DEFINER LANGUAGE plpgsql AS $$ BEGIN PERFORM set_config('timezone', _new_time_zone, true /* local */) ; RETURN current_setting('timezone') ; END; $$; SELECT test_set_time_zone_2('US/Central') ; 子句仅适用于执行计划参数。 USING没有执行计划 - 然后SET子句不可用。