【问题标题】:Server timezone offset value服务器时区偏移值
【发布时间】:2012-09-02 08:39:02
【问题描述】:

我正在处理与数据库服务器相关的日期。

在 Oracle 中,要获得完整的时区偏移量,您可以使用以下内容:

select tz_offset(SESSIONTIMEZONE) from dual;

select tz_offset(DBTIMEZONE) from dual;

在我的情况下,这些会返回(重要的是它包括标志)

-04:00

我想知道 Postgres 中有什么功能可以得到与上述 Oracle 版本完全相同的格式的结果?我需要知道服务器的时区偏移量,包括指示它落后或领先于 GMT/UTC 的标志。

【问题讨论】:

    标签: sql postgresql datetime


    【解决方案1】:

    “to_char”格式化组件,trim 去掉了“sign”字符,它只是一个正数的空格。

    select trim(to_char(extract(timezone_hour from now()), '00')) ||
           ':' ||
           trim(to_char(extract(timezone_minute from now()), '00')) AS tz
    

    查看documentation 的时间函数。

    【讨论】:

    • 这里不要使用trim,而是使用FM00
    【解决方案2】:

    对于时区,您可以:

    SHOW timezone;
    

    或等价物:

    SELECT current_setting('TIMEZONE');
    

    但这可以是服务器接受的任何格式,因此它可能返回 UTC08:00Australia/Victoria 或类似的。

    令人沮丧的是,似乎没有内置函数来报告客户端使用的 UTC 时间偏移(以小时和分钟为单位),这对我来说似乎有点疯狂。您可以通过将UTC当前时间与本地当前时间进行比较来获得偏移量:

    SELECT age(current_timestamp AT TIME ZONE 'UTC', current_timestamp)`
    

    ...但是 IMO 从current_timestamp 中提取 tz 偏移量(以秒为单位)并转换为间隔更简洁:

    SELECT to_char(extract(timezone from current_timestamp) * INTERVAL '1' second, 'FMHH24:MM');
    

    这将匹配所需的结果,只是它不产生前导零,因此-05:00 只是-5:00。令人烦恼的是,似乎不可能让to_char 在几个小时内产生前导零,从而使我得到以下丑陋的手动格式:

    CREATE OR REPLACE FUNCTION oracle_style_tz() RETURNS text AS $$
    SELECT to_char(extract(timezone_hour FROM current_timestamp),'FM00')||':'||
           to_char(extract(timezone_minute FROM current_timestamp),'FM00');
    $$ LANGUAGE 'SQL' STABLE;
    

    感谢 Glenn 的 timezone_hourtimezone_minute,而不是我之前使用的 extract(timezone from current_timestamp) * INTERVAL '1' second) 和 CTE 的 hack。

    如果您不需要前导零,您可以改用:

    CREATE OR REPLACE FUNCTION oracle_style_tz() RETURNS text AS $$
    SELECT to_char(extract(timezone from current_timestamp) * INTERVAL '1' second, 'FMHH24:MM');
    $$ LANGUAGE 'SQL' STABLE;
    

    另见:

    【讨论】:

    • 多么令人难以置信的回复。非常感谢您的专业知识。
    猜你喜欢
    • 2015-05-30
    • 1970-01-01
    • 2010-12-23
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多