如何从间隔列中减少秒数?

时间:2013-10-31 11:54:27

标签: postgresql

在我的表中,work_time列(interval类型)的结果显示为200:00:00。是否可以剪切秒部分,因此它将显示为200:00?或者,甚至更好:200h00min(我看到它在插入中接受h单位,所以为什么不加载它?)。 最好是通过更改work_time列,而不是通过更改select查询。

1 个答案:

答案 0 :(得分:0)

这不是您应该通过更改列而是通过以某种方式更改选择查询来执行的操作。如果更改列,则会更改存储和功能用途,这并不好。要在输出上更改它,您需要修改它的检索方式。

您有两个基本选项。第一种是使用to_char(myintervalcol, 'HH24:MI')

直接修改您的选择查询

但是,如果您的问题是您希望在选择查询中具有通用访问权限,则PostgreSQL有一个简洁的技巧,我称之为“表方法”。您可以将一个函数附加到表中,以便您可以使用与新列类似(但不完全相同)的语法调用它。在这种情况下,您可以执行以下操作:

 CREATE OR REPLACE FUNCTION myinterval_nosecs(mytable) RETURNS text LANGUAGE SQL 
 IMMUTABLE AS
 $$
     SELECT to_char($1.myintervalcol, 'HH24:MI');
 $$;

这适用于行输入,而不适用于基础表。因为它始终为相同的输入返回相同的信息,所以您可以将其标记为不可变,甚至索引输出(意味着它可以在计划时运行并使用索引)。

要打电话给你,你可以这样做:

SELECT myinterval_nosecs(m) FROM mytable m;

但是您可以使用上面的特殊语法将其重写为:

SELECT m.myinterval_nosecs FROM mytable m;

请注意,由于myinterval_nosecs是一个函数,因此您无法在开头省略m.。这是因为查询计划程序将使用以前的语法重写查询,并且不会猜测您运行它的意思。