Skip to content

Preserve tz when converting to jsonb timestamptz #7

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from

Conversation

theory
Copy link
Owner

@theory theory commented Jul 2, 2024

The JSONB jbvDatetime type has a field for offset, and displays the time in that offset. For example, when the time zone GUC is set to America/New_York, the jsonpath timestamp_tz() method returns a value that displays a parsed value with its offset, not the local offset:

david=# set time zone 'America/New_York';
SET
david=# select jsonb_path_query_tz('"2024-08-15 12:34:56+10"', '$.timestamp_tz()');
    jsonb_path_query_tz
-----------------------------
"2024-08-15T12:34:56+10:00"

This was not true for values parsed by timestamp_tz() that lacked an offset. It correctly assumes the local time zone, but displays it in UTC:

david=# select jsonb_path_query_tz('"2024-08-15 12:34:56"', '$.timestamp_tz()');
    jsonb_path_query_tz
-----------------------------
"2024-08-15T16:34:56+00:00"

To fix this inconsistent behavior, determine the offset for values being cast from DATEOID and DATEOID types to jpiTimestampTz and store it in the resulting jbvDatetime value. With this change, the result now preserves the offset just as it does when converting from offset-aware values:

david=# select jsonb_path_query_tz('"2024-08-15 12:34:56"', '$.timestamp_tz()');
    jsonb_path_query_tz
-----------------------------
"2023-08-15T12:34:56-04:00"

Author: David Wheeler
Reviewed-by: Junwang Zhao
Discussion: https://postgr.es/m/7DE080CE-6D8C-4794-9BD1-7D9699172FAB%40justatheory.com

@theory theory self-assigned this Jul 2, 2024
@theory theory force-pushed the jsonpath-datetime-string branch 3 times, most recently from 5cda455 to 31fea30 Compare July 10, 2024 14:25
@theory theory changed the title Document impact of datestyle on jsonpath string() Preserve tz when converting to jsonb timestamptz Jul 10, 2024
@theory theory force-pushed the jsonpath-datetime-string branch 2 times, most recently from 5985426 to 6188d9b Compare July 10, 2024 15:18
@theory theory force-pushed the jsonpath-datetime-string branch 2 times, most recently from 7f03761 to fa212e8 Compare July 22, 2024 17:24
The JSONB jbvDatetime type has a field for offset, and displays the time
in that offset. For example, when the time zone GUC is set to
America/New_York, the jsonpath `timestamp_tz()` method returns a value
that displays a parsed value with its offset, not the local offset:

    david=# set time zone 'America/New_York';
    SET
    david=# select jsonb_path_query_tz('"2024-08-15 12:34:56+10"', '$.timestamp_tz()');
        jsonb_path_query_tz
    -----------------------------
    "2024-08-15T12:34:56+10:00"

This was not true for values parsed by `timestamp_tz()` that lacked an
offset. It correctly assumes the local time zone, but displays it in
UTC:

    david=# select jsonb_path_query_tz('"2024-08-15 12:34:56"', '$.timestamp_tz()');
        jsonb_path_query_tz
    -----------------------------
    "2024-08-15T16:34:56+00:00"

To fix this inconsistent behavior, determine the offset for values being
cast from `DATEOID` and `TIMESTAMPOID` types to `jpiTimestampTz` and store
it in the resulting jbvDatetime value. With this change, the result now
preserves the offset just as it does when converting from offset-aware
values:

    david=# select jsonb_path_query_tz('"2024-08-15 12:34:56"', '$.timestamp_tz()');
        jsonb_path_query_tz
    -----------------------------
    "2023-08-15T12:34:56-04:00"

Author: David Wheeler
Reviewed-by: Junwang Zhao and Jeevan Chalke
Discussion: https://postgr.es/m/7DE080CE-6D8C-4794-9BD1-7D9699172FAB%40justatheory.com
@theory theory force-pushed the jsonpath-datetime-string branch from fa212e8 to 11c8c3c Compare July 22, 2024 17:27
@theory
Copy link
Owner Author

theory commented Jul 30, 2024

Merged in 524d490

@theory theory closed this Jul 30, 2024
@theory theory deleted the jsonpath-datetime-string branch July 30, 2024 13:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant