sql - 服务器时区偏移值

标签 sql postgresql datetime

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

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

select tz_offset(SESSIONTIMEZONE) from dual;

select tz_offset(DBTIMEZONE) from dual;

就我而言,这些将返回(重要的是它包括标志)

-04:00

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

最佳答案

对于时区,您可以:

SHOW timezone;

或同等内容:

SELECT current_setting('TIMEZONE');

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

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

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

...但在我看来,从 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_month,而不是我之前使用的 hack 的 extract(timezone from current_timestamp) * INTERVAL '1' secondary) 和 CTE。

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

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;

另请参阅:

关于sql - 服务器时区偏移值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12335438/

相关文章:

sql - 在 OPENQUERY 中包含参数

sql - 在oracle sql中根据周末和工作日分离信息

postgresql - 存储过程避免并发语句的死锁

javascript - 如何在 Javascript 中将日期转换为其他时区

python - 将原始日期时间对象转换为 UTC 时区

sql - 插入插入的id到另一个表

SQLite3 Group By 错误地仅返回 1 行

postgresql - 使用查询工具在 pgAdmin 4 中查询时设置默认架构

postgresql - 如何从 PostgreSQL 数据库中查找和删除一些表

php - 无法将数据库值 "1876-01-01 00:00:00-00:00:00"转换为 Doctrine 类型日期时间