Преобразование GMT ​​в CST в postgresql - PullRequest
0 голосов
/ 03 августа 2020

В настоящее время я работаю с необработанными данными с отметками времени в GMT, и я хочу преобразовать их в CST. Я пытаюсь использовать функцию приведения для изменения метки времени, но она не работает - время не изменяется. Большая часть того, что я читал о часовых поясах в postgresql, предполагает, что часовой пояс по умолчанию - UT C, поэтому я не уверен, нужен ли другой синтаксис, когда данные, которые я пытаюсь преобразовать, - это GMT. Любая помощь приветствуется!

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"

Ответы [ 2 ]

2 голосов
/ 03 августа 2020

Как заметил @Mike Organek, поле типа timestamp предполагает местное время при входе. Итак, первое, что вам нужно установить, - это sh, откуда вводятся даты и действительно ли они вводятся как GMT. На данный момент, предполагая, что это так, вы можете сделать следующее:

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.

0 голосов
/ 03 августа 2020

Учитывая, что JoinDate является типом timestamp, это должно быть хорошим обходным путем для вашей ситуации теперь, когда мы установили, что значения в JoinDate типа timestamp представляют временные метки UTC / GMT, а ваш сервер не в UTC / GMT. Идеальное решение - использовать столбцы timestamptz.

Хитрость заключается в том, чтобы преобразовать JoinDate в text, добавить к нему z, чтобы получилось UT C, а затем приведите его на timestamptz. Как только это будет сделано, вы можете использовать at time zone 'us/chicago' для преобразования за вас.

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";
...