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;
我有一些带有时间字段的市场数据存储在 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;