2012-01-30 271 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

相关问题