PostgreSQL时间转换/格式化从" 24:00:00"到" 00:00:00"在SELECT语句中

时间:2015-01-13 10:16:49

标签: python sql postgresql psycopg2 scientific-computing

我有一些市场数据,时间字段存储在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"。因此,如果我获取包含" 24:00:00"使用 psycopg2 模块我收到错误" ValueError:小时必须在0..23" ,因为时间字段无法正确转换。

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

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

有没有办法用SQL实现这个?

提前致谢!

2 个答案:

答案 0 :(得分:4)

'24:00:00'::time的问题显然是psycopg2错误。当我们等待Daniele或我修复它时(如果可能的话),这是一个解决方法:只需使用CASE表达式来检查导致错误的特定值。如果您的表名为tabtime列为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

答案 1 :(得分:2)

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

select (current_date + market_data_time)::time;