Postgresql Postgres:如何按带时区的字符串日期排序?

Postgresql Postgres:如何按带时区的字符串日期排序?,postgresql,date,Postgresql,Date,在我的PostgreSQL数据库中,我存储JSONB,其中一个JSON节点是以下格式的日期字符串: YYYY-MM-DD,然后是24小时格式的小时,分和秒,后跟时区偏移,如下所示: 2003-06-30 05:51:54+00:00 2003-06-3014:25:45+10:00 但是,当我按ASC顺序对日期进行排序时,时间并没有按时区偏移量正确排序,我认为这是因为PostgreSQL仍然将日期视为字符串 SELECT header.id, header.data ->&g

在我的PostgreSQL数据库中,我存储JSONB,其中一个JSON节点是以下格式的日期字符串:

YYYY-MM-DD,然后是24小时格式的小时,分和秒,后跟时区偏移,如下所示:

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

但是,当我按ASC顺序对日期进行排序时,时间并没有按时区偏移量正确排序,我认为这是因为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-3014:25:45+10:00应该是第一个,但它是第二个结果。 2003-06-30 05:51:54+00:00 2003-06-3014:25:45+10:00

以下是一个示例屏幕截图:


有没有办法在我的查询中将每个日期字符串直接转换为时间戳并正确排序?

->>返回文本,因此您应该在不转换为文本的情况下对其排序

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;

将字符串转换为真实的时间戳:

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;
我应该去工作