繁体   English   中英

如何获取PostgreSQL特定时区的时间?

[英]How to get time in specific time zone in PostgreSQL?

这个问题被问了很多次。 但是没有一个实现能给我正确的答案。 我正在尝试在 select 查询中将UTC日期/时间转换为IST (印度标准时间)。

目前,它是 18:something in IST。 在 UTC 中是 12:something。

我用他们的 output 尝试过的事情:

START_TIME(输入):'2021-10-01 12:43:24.014902+00'

START_TIME AT TIME ZONE 'IST'2021-10-01T10:43:24.014Z

(START_TIME AT TIME ZONE 'UTC')::TIMESTAMP AT TIME ZONE 'IST'2021-10-01T10:43:24.014Z

(START_TIME AT TIME ZONE 'UTC') AT TIME ZONE 'IST'2021-10-01T09:13:24.014Z

(START_TIME::TIMESTAMP) AT TIME ZONE INTERVAL '+05:30'2021-10-01T07:13:24.014Z

而它应该给我2021-10-01T18:xx:xx.xxxx

我错过了什么?

UPDATE: (START_TIME AT TIME ZONE 'UTC') + INTERVAL '05:30 HOURS' AS DATE给出了期望的结果。 但是自己添加偏移量是一种不好的做法吗?

时区缩写不明确:

SELECT * FROM pg_timezone_names WHERE abbrev = 'IST';

        name         │ abbrev │ utc_offset │ is_dst 
═════════════════════╪════════╪════════════╪════════
 Eire                │ IST    │ 01:00:00   │ f
 Asia/Calcutta       │ IST    │ 05:30:00   │ f
 Asia/Kolkata        │ IST    │ 05:30:00   │ f
 Europe/Dublin       │ IST    │ 01:00:00   │ f
 posix/Eire          │ IST    │ 01:00:00   │ f
 posix/Asia/Calcutta │ IST    │ 05:30:00   │ f
 posix/Asia/Kolkata  │ IST    │ 05:30:00   │ f
 posix/Europe/Dublin │ IST    │ 01:00:00   │ f
(8 rows)

具体并使用明确的时区名称:

SELECT TIMESTAMP '2021-10-01 12:43:24.014902'
       AT TIME ZONE 'UTC'    /* how late is it when an UTC clock shows the above? */
       AT TIME ZONE 'Asia/Kolkata'  /* What does an Indian clock show at that time? */;

          timezone          
════════════════════════════
 2021-10-01 18:13:24.014902
(1 row)

看,如果你有一个没有时区列的时间戳,并且你将时间戳存储为 UTC,你需要告诉 PostgreSQL,然后告诉它把它转换成你当地的时区。 希望这个例子会有所帮助:

select created_at at time zone 'utc' at time zone 'Asia/Kolkata'
from users;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM