AS400 SQL数据库查询

时间:2019-03-19 00:50:12

标签: sql ibm-midrange db2-400 sql-date-functions

时间列的字符串类型包含时间,格式为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

在同一查询中而不必运行其他查询?

谢谢大家!

3 个答案:

答案 0 :(得分:3)

在DB2中,您可以使用@ECHO OFF SET "inputFile=.\countds.csv" powershell -NoLogo -NoProfile -Command ^ "Get-Content -Path '%inputFile%' |" ^ "ForEach-Object {" ^ "$ns = $_ -replace '~','';" ^ "if (($_.Length - $ns.Length) -ne 7) {" ^ "'Length is {0}' -f ($_.Length - $ns.Length)" ^ "}" ^ "}" (这是TIMESTAMP_FORMAT()的方便别名)将字符串转换为日期,然后使用TO_DATE()(又名VARCHAR_FORMAT())转换为日期。格式化:

TO_CHAR()

The documentation指出支持丢失的前导零:

  

string-expression的代表时间戳组成部分的子字符串(例如年,月,日,时,分,秒)可以包含少于相应组成部分所指示的时间戳组成部分的最大位数格式元素。任何缺少的数字默认为零。例如,使用格式为SELECT TO_CHAR(TO_DATE(timecolumn, 'HH24MISS'), 'HH24:MI:SS') FROM DBNAME.TABLENAME LIMIT 5 的字符串,输入值'YYYY-MM-DD HH24:MI:SS'将产生与'999-3-9 5:7:2'相同的结果。


正如@Dinu和@jmarkmurphy所评论的那样,这可能会失败,因为时间部分没有分开。在这种情况下,另一种方法是在转换前手动添加缺少的尾随'0999-03-09 05:07:02'

0

答案 1 :(得分:1)

TO_DATE()在IBM i的Db2上不可用... 显然它可用,但仅作为TIMESTAMP_FORMAT()函数下的语法替代文件记录在SQL参考中

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

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

以下将起作用

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

答案 2 :(得分:-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) =>秒