Postgres:如果采用smtp格式的时间戳,则排序错误

时间:2018-02-22 19:58:02

标签: postgresql timestamp

我正在开发一个项目,我们使用SMTP发送一些数据,如果它们已经存储为像'Fri, 18 Aug 17 14:15:26 UTC'这样的smtp格式(例如psql=> select time, to_char(time, 'Dy, FMDD Mon YY HH24:MI:SS TZ') as smtp_time from messages order by smtp_time; time | smtp_time ----------------------------+----------------------------- 2017-08-18 14:15:26.537+00 | Fri, 18 Aug 17 14:15:26 UTC 2017-08-18 14:17:33.57+00 | Fri, 18 Aug 17 14:17:33 UTC 2017-07-10 14:11:46.035+00 | Mon, 10 Jul 17 14:11:46 UTC 2017-07-10 14:21:27.032+00 | Mon, 10 Jul 17 14:21:27 UTC 2017-07-10 14:21:40.541+00 | Mon, 10 Jul 17 14:21:40 UTC 2017-07-10 14:23:01.928+00 | Mon, 10 Jul 17 14:23:01 UTC 2017-07-10 14:23:15.508+00 | Mon, 10 Jul 17 14:23:15 UTC 2017-07-10 14:24:14.322+00 | Mon, 10 Jul 17 14:24:14 UTC 2017-07-10 14:26:21.426+00 | Mon, 10 Jul 17 14:26:21 UTC 2017-07-10 14:35:38.044+00 | Mon, 10 Jul 17 14:35:38 UTC .... 2017-08-16 16:03:29.214+00 | Wed, 16 Aug 17 16:03:29 UTC 2017-08-16 16:04:16.037+00 | Wed, 16 Aug 17 16:04:16 UTC 2017-08-16 16:05:07.444+00 | Wed, 16 Aug 17 16:05:07 UTC 2017-07-26 13:49:13.217+00 | Wed, 26 Jul 17 13:49:13 UTC (96 rows) ),我会对排序时间戳有一些奇怪的问题。

一个孤立的案例,使用smtp_message_time进行排序:

interval(timestamp with time zone, timestamp with time zone)

在一些最终结果中发现负间隔之后我发现了这个问题。

  1. 这种行为有合理的解释吗?
  2. 我有什么遗漏或者我可以做的是正确解析格式吗?
  3. 如果可能的话,我宁愿使用smtp格式作为我的第一选择,而不是Postgres格式,因为它已经存储过,并且需要进行一些代码重写。

    另一方面,我已经注意到我需要使用l=[[1,2,3], [4,8], [5,10]] ansList = [] for i in range(len(l[0])): for j in range(len(l[1])): for k in range(len(l[2])): if l[0][i]<l[1][j] and l[1][j]<l[2][k]: ansList.append([l[0][i],l[1][j],l[2][k]]) print(ansList) 来考虑时区,我还注意到我可以把一周的不同日期和结果保持不变。

1 个答案:

答案 0 :(得分:1)

PostgreSQL在接受时间戳的输入方面非常灵活。

SELECT 'Fri, 18 Aug 17 14:15:26 UTC'::timestamptz;

      timestamptz       
------------------------
 2017-08-18 16:15:26+02
(1 row)

所以你可以

ORDER BY smtp_time::timestamptz