AS400 SQL数据库查询

问题描述 投票:1回答:3

时间列的字符串类型包含格式为HHMMSS的时间。示例数据是:

95030    
122030
132030 

如您所见,没有前导零。

我试图提取上述值并将它们转换为类似下面的内容

95030 -> 9:50:30
122030 -> 12:20:30

Sql查询:

select cast(Left(TIMECOLUMN, 1,1)||':'||substring(TIMECOLUMN,2,2)||':'||substring(TIMECOLUMN, 4,2) as string) 
from DBNAME.TABLENAME LIMIT 5;

以上查询只能在下面执行,

95030 -> 9:50:30

我该怎么做:

122030 -> 12:20:30

在同一个查询中,无需运行不同的查询?

谢谢大家!

sql ibm-midrange db2-400 sql-date-functions
3个回答
3
投票

在DB2中,您可以使用TO_DATE()(这是TIMESTAMP_FORMAT()的一个方便的别名)将字符串转换为日期,并使用TO_CHAR()(aka VARCHAR_FORMAT())来格式化它:

SELECT TO_CHAR(TO_DATE(timecolumn, 'HH24MISS'), 'HH24:MI:SS') FROM DBNAME.TABLENAME LIMIT 5

The documentation声明支持缺少前导零:

表示时间戳的组件(例如年,月,日,小时,分钟,秒)的字符串表达式的子字符串可以包括小于由对应格式元素指示的时间戳的该组件的最大位数。任何缺失的数字都默认为零。例如,对于'YYYY-MM-DD HH24:MI:SS'的格式字符串,'999-3-9 5:7:2'的输入值将产生与'0999-03-09 05:07:02'相同的结果。


正如@Dinu和@jmarkmurphy评论的那样,由于时间部分没有分开,这可能会失败。在那种情况下,另一种方法是在转换之前手动添加缺失的尾随0

SELECT TO_CHAR(
    TO_DATE(
        RIGHT('000000' || timecolumn, 6),
        'HH24MISS'
    ),
    'HH24:MI:SS') 
FROM DBNAME.TABLENAME LIMIT 5

1
投票

对于IBM i,Daz2不提供TO_DATE() ... 显然它是可用的,但只在SQL参考中记录为TIMESTAMP_FORMAT()函数下的语法替代

TIMESTAMP_FORMAT()是(假设您使用的是当前支持的版本)

但是,它需要95030的前导零...

以下将有效

select char(time(timestamp_format(right('0' concat timecolumn ,6),'HH24MISS')))
from DBNAME.TABLENAME

-1
投票
  • 使用Right而不是Left。基于权利的立场是固定的。

要么

  • 使用带有负索引的SUBSTR。负指数意味着从右边开始。即SUBSTR(X,-2,2)是秒,SUBSTR(X,-4)是几小时。

要么

  • 将其视为一个整数并使用,即MOD(X,100)为秒,MOD(FLOOR(X / 100),100)为分钟等

要么

  • 如果@Strom是正确的并且SUBSTR不允许负指数 - 只是前置LEN()SUBSTR(X,LENGTH(X)-2,2) =>秒
© www.soinside.com 2019 - 2024. All rights reserved.