SELECT 语句中的 PostgreSQL 时间 conversion/formatting 从“24:00:00”到“00:00:00”

PostgreSQL time conversion/formatting from "24:00:00" to "00:00:00" in SELECT statement

我有一些带有时间字段的市场数据存储在 PostgreSQL 数据库中。 PostgreSQL 使用格式“00:00:00”到“24:00:00”来存储时间(参见 http://www.postgresql.org/docs/9.1/static/datatype-datetime.html),只要我只在数据库中工作,它就可以完美工作。

问题是我之后需要做一些数据处理(使用Python)而Python datetime.time格式只支持从“00:00:00”到“23:00:00”的时间。因此,如果我使用 psycopg2 模块获取包含“24:00:00”的记录,我会收到错误 "ValueError: hour must be in 0..23" 因为时间字段无法正确转换。

我的一个干净的解决方法是将 SELECT 语句中已经包含“24:00:00”的时间字段转换为“00:00:00”。这将解决问题,因为转换器功能之后不会失败。

我已经查看了格式化函数(参见 http://www.postgresql.org/docs/9.4/static/functions-formatting.html)但找不到合适的..

有没有办法使用 SQL 来实现这一点?

提前致谢!

'24:00:00'::time 的问题显然是 psycopg2 错误。当我们等待 Daniele 或我修复它时(如果可能的话),这里有一个解决方法:只需使用 CASE 表达式来检查导致错误的特定值。如果你的 table 被命名为 tab 并且 time 列是 t 那么你可以这样做:

SELECT CASE t WHEN '24:00:00'::time THEN '0:00:00'::time ELSE t END FROM tab;

一切都应该正常。

请注意,只有在提取 time 列时才会出现此问题。似乎 PostgreSQL 将 timestamp 列(甚至代表闰秒的列)转换为相应的午夜,即 2012-6-30T24:00:00(2012 年 6 月 30 日闰秒)导致 2012-7-1T00:00:00.

当您将 time 添加到 date 时,结果是 timestamp,您可以将其转换为 time:

select (current_date + market_data_time)::time;