Postgres: Как отсортировать по строковой дате с часовым поясом? - PullRequest
1 голос
/ 01 мая 2020

В моей PostgreSQL БД я храню JSONB, где один из узлов JSON представляет собой строку даты в следующем формате:

ГГГГ-ММ-ДД, затем часы в 24-часовом формате , минуты и секунды, за которыми следует смещение часового пояса, например:

2003-06-30 05: 51: 54 + 00: 00 2003-06-30 14: 25: 45 + 10: 00

Когда я делаю сортировку по дате в порядке AS C, время не сортируется должным образом по смещению часового пояса, и я думаю, это потому, что PostgreSQL все еще смотрит на даты, как если бы они были строками .

SELECT header.id,
       header.data ->> 'date'    as "Date"
 FROM all_messages.sci_math_headers header
WHERE header.data ->> 'msgid' = 'xyz'
   OR header.data ->> 'ref' like '%xyz>%'
ORDER BY header.data ->> 'date' ASC
LIMIT 20;

Так что, хотя 2003-06-30 14: 25: 45 + 10: 00 должно быть первым, это будет вторым результатом. 2003-06-30 05: 51: 54 + 00: 00 2003-06-30 14: 25: 45 + 10: 00

Вот пример снимка экрана:

enter image description here

Можно ли преобразовать каждую строку даты в метку времени непосредственно в моем запросе и правильно отсортировать ее?

Ответы [ 2 ]

2 голосов
/ 01 мая 2020

Преобразуйте ваши строки в истинные метки времени:

SELECT header.id,
       header.data ->> 'date'    as "Date"
 FROM all_messages.sci_math_headers header
WHERE header.data ->> 'msgid' = 'xyz'
   OR header.data ->> 'ref' like '%xyz>%'
ORDER BY (header.data ->> 'date')::timestamptz ASC -- Changes here
LIMIT 20;

должно работать.

0 голосов
/ 01 мая 2020

- >> возвращает текст, поэтому вы должны отсортировать его без преобразования в текст;

SELECT header.id,
   header.data ->> 'date'    as "Date"
FROM all_messages.sci_math_headers header
WHERE header.data ->> 'msgid' = 'xyz'
   OR header.data ->> 'ref' like '%xyz>%'
ORDER BY header.data ASC
LIMIT 20;
...