gpt4 book ai didi

postgresql - 如何在 postgres 函数中设置时区

转载 作者:行者123 更新时间:2023-11-29 12:09:19 29 4
gpt4 key购买 nike

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. 您可以使用 EXECUTE命令,带有完全构造的字符串(即:没有 USING1),并使用 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. You can use the set_config() function in a similar fashion, being called via PERFORM, setting 'timezone' as the parameter to configure, and deciding whether to make the setting local or global.

    You can check it with:

    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') ;
    | test_set_time_zone_2 || :------------------- || US/Central           |

您可以在 dbfiddle here 中检查这两个函数 我没有尝试任何全局设置,因为我猜想在这个平台上,网络用户将没有适当的权限;我最好的猜测是,您可以在系统中做等效的事情来进行全局更改。


1) 根据 Pavel Stehule 的评论:USING 子句仅适用于执行计划参数。 SET 没有执行计划 - 然后 USING 子句不可用。

关于postgresql - 如何在 postgres 函数中设置时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45126163/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com