首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在postgresql中将GMT转换为CST

在postgresql中将GMT转换为CST
EN

Stack Overflow用户
提问于 2020-08-03 18:27:07
回答 2查看 720关注 0票数 0

我目前正在处理GMT中有时间戳的原始数据,我希望将它们转换为CST。我试图使用cast功能来更改时间戳,但它不起作用-时间不受影响。我在postgresql中所读到的大多数关于时区的文章都假设默认时区是UTC,所以当我试图转换的数据是GMT时,我不确定是否需要一种不同的语法。任何帮助都是非常感谢的!

代码语言:javascript
复制
WITH RECURSIVE "child" AS (
    SELECT "ConsultantDisplayID",
           "JoinDate",
           "ParentPersonDisplayID"
    FROM "public"."flight_export_consultant"
    WHERE "ConsultantDisplayID" = '4019'
UNION 
    SELECT c."ConsultantDisplayID", 
           CAST(c."JoinDate" at time zone 'america/chicago' as timestamp) as "JoinDate"
           c."ParentPersonDisplayID"
    FROM "public"."flight_export_consultant" AS c 
    JOIN "child" AS cd 
    ON c."ParentPersonDisplayID" = cd."ConsultantDisplayID"),
    
"sponsor" AS (
    SELECT 
        "child".*,
        c1."ConsultantDisplayID",
        Cast(c."JoinDate" at time zone 'america/chicago' as timestamp) as "Sponsor JoinDate"
    FROM "public"."flight_export_consultant" AS c1
    LEFT JOIN "child" 
    ON c1."ConsultantDisplayID" = "child"."ParentPersonDisplayID")  

SELECT * FROM "sponsor"
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-03 19:17:37

既然JoinDatetimestamp类型,那么对于您的情况来说,这应该是一个很好的解决方案,因为我们已经确定,timestamp类型的JoinDate值表示UTC/GMT时间戳,而您的服务器不在UTC/GMT中。理想的解决方案是使用timestamptz列。

这里的诀窍是将JoinDate转换为text,在其上附加一个z以使其成为UTC,然后将其转换为timestamptz。一旦完成,您可以使用at time zone 'us/chicago'为您进行转换。

代码语言:javascript
复制
WITH RECURSIVE "child" AS (
    SELECT "ConsultantDisplayID",
           "JoinDate",
           "ParentPersonDisplayID"
    FROM "public"."flight_export_consultant"
    WHERE "ConsultantDisplayID" = '4019'
UNION 
    SELECT c."ConsultantDisplayID", 
           "JoinDate",
           c."ParentPersonDisplayID"
    FROM "public"."flight_export_consultant" AS c 
    JOIN "child" AS cd 
    ON c."ParentPersonDisplayID" = cd."ConsultantDisplayID"),
    
"sponsor" AS (
    SELECT 
        "child".*,
        c1."ConsultantDisplayID",
        c."JoinDate" as "Sponsor JoinDate"
    FROM "public"."flight_export_consultant" AS c1
    LEFT JOIN "child" 
    ON c1."ConsultantDisplayID" = "child"."ParentPersonDisplayID")  

SELECT "ConsultantDisplayID", 
       ("JoinDate"::text||'z')::timestamptz at 'america/chicago' as "JoinDate",
       "ParentPersonDisplayID",
       "ConsultantDisplayID",
       ("JoinDate"::text||'z')::timestamptz at 'america/chicago' as "Sponsor JoinDate"
FROM "sponsor";
票数 0
EN

Stack Overflow用户

发布于 2020-08-03 19:38:26

正如@Mike指出的那样,timestamp类型的字段在输入时假定为本地时间。因此,您需要确定的第一件事是日期是从哪里输入的,以及它们是否实际上是作为GMT输入的。目前,假设他们是,你可以做以下工作:

代码语言:javascript
复制
select 'September 24, 2018, 4:01PM'::timestamp at time zone 'utc' at time zone 'america/chicago';
      timezone       
---------------------
 09/24/2018 11:01:00

-- Or if you want to stick to GMT

select 'September 24, 2018, 4:01PM'::timestamp at time zone 'gmt' at time zone 'america/chicago';
      timezone       
---------------------
 09/24/2018 11:01:00

基本上,您是在UTC/GMT‘锚定’时间戳,然后转换为'america/chicago'。换句话说,复制timestamptz字段的功能。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63234959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档