2012-01-30 22 views
1

我有時間在Db2字段中存儲爲hhmmss(41634)。我想在SQL中將其格式化爲HH:MM:SS。我試圖像SUBSTR 許多事情例如:如何將存儲在DB2中的時間格式化爲hhmmss

select substr(fieldTME,1,1) as HOUR, substr(fieldTME,2,2) as Minute, 
substr(fieldTME,4,2) as Second from tbl1 where filed2 ='80404454' 

與上面的SQL亞姆能夠拿到4成時16分34秒作爲。但是,如果時間值是存儲爲(102333)。上述SQL不起作用。我是否可以格式化SQL中的小時,分​​鍾和秒作爲hh:mms:ss

+1

時間字段是字符串還是整數? – 2012-01-30 16:36:18

+1

應始終將時間值存儲爲「時間」數據類型(或可能將日期作爲「時間戳」)。此外,顯示格式通常應該放在_view_代碼中,而不是數據庫中 - 在Web上下文中,數據庫通常不知道請求者來自哪裏,因此無法做出正確的決定。 – 2012-01-30 17:14:43

回答

3

首先,應該指出的是DateTime值應始終保存爲這些類型(和山口因爲Timestamp,不是作爲單獨的字段),而不是intchar類型 - 你遇到的頭痛是不值得的(主要與無效值有關)。

因爲@ galador的回答會不會對我的版本(的iSeries V6R1)工作,這裏是一個沒有工作(字符或數字類型)。

SELECT TIME(SUBSTR(RIGHT('0' || fieldTME, 6), 1, 2) || ':' || 
      SUBSTR(RIGHT(fieldTME, 4), 1, 2) || ':' || 
      RIGHT(fieldTME, 2)) AS resultTime 
FROM Tbl1   
0

您可能希望將數據標準化一點,以便始終有6個數字。您可以使用LPAD()做到這一點(它會留下墊一個字符串的字符列的最大長度是X ),然後提取使用SUBSTR()的值作爲你現在做的:

SELECT SUBSTR(LPAD(fieldTME, 6, '0'), 1, 2) 
     || ':' || 
     SUBSTR(LPAD(fieldTME, 6, '0'), 3, 2) 
     || ':' || 
     SUBSTR(LPAD(fieldTME, 6, '0'), 5, 2) 
FROM tbl1 
WHERE field2 = '80404454' 

如果你真的想轉換爲TIME數據類型,你可以使用TIME()功能:

SELECT TIME(SUBSTR(LPAD(fieldTME, 6, '0'), 1, 2) 
      || ':' || 
      SUBSTR(LPAD(fieldTME, 6, '0'), 3, 2) 
      || ':' || 
      SUBSTR(LPAD(fieldTME, 6, '0'), 5, 2) 
     ) AS time 
FROM tbl1 
WHERE field2 = '80404454' 
+0

至少iSeries版V6R1,'LPAD()'不存在,並提供' ':''會妥善反正轉換... – 2012-01-30 17:21:14

+0

@ X-零:嗯,DB2的幾個平臺的樂趣。我通常會盡量記得提及我的答案是針對Linux/Unix/Windows(偶爾是z/OS),但這次卻忘記了。 (對於它的價值,我的答案在LUW和z/OS上產生了正確的結果) – bhamby 2012-01-30 19:27:02

相關問題