Preserve tz when converting to jsonb timestamptz#7
Closed
Conversation
5cda455 to
31fea30
Compare
5985426 to
6188d9b
Compare
7f03761 to
fa212e8
Compare
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
fa212e8 to
11c8c3c
Compare
Owner
Author
|
Merged in 524d490 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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: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:To fix this inconsistent behavior, determine the offset for values being cast from
DATEOIDandDATEOIDtypes tojpiTimestampTzand 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:Author: David Wheeler
Reviewed-by: Junwang Zhao
Discussion: https://postgr.es/m/7DE080CE-6D8C-4794-9BD1-7D9699172FAB%40justatheory.com