2013-10-31 91 views
0

在我的表結果列work_timeinterval類型)顯示爲200:00:00。是否有可能減少秒部分,所以它會顯示爲200:00?或者,甚至更好:200h00min(我已經看到它接受插入h單位,所以爲什麼不加載它像這樣?)。 優選地,通過更改work_time列,而不是通過更改select查詢。如何從間隔欄中刪除秒?

+0

如果你想顯示某些東西,['TO_CHAR'](http://www.postgresql.org/docs/current/static/functions-formatting.html)是你的朋友。請參閱[「間隔輸出」](http://www.postgresql.org/docs/current/static/datatype-datetime.html#DATATYPE-INTERVAL-OUTPUT),以獲取影響間隔類型的默認輸出格式的方法。 –

回答

0

這不是你應該通過改變列而是通過以某種方式改變選擇查詢來完成的。如果您更改了列,您正在更改存儲和功能用途,但這並不好。要在輸出中對其進行更改,您需要修改其檢索方式。

您有兩個基本選項。第一種方法是直接修改您的選擇查詢,使用to_char(myintervalcol, 'HH24:MI')

但是,如果你的問題是,你必須要在你的SELECT查詢普及的通用格式,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.。這是因爲查詢規劃器將用前面的語法重寫查詢,並且不會猜測您要運行它的關係。