时间列的字符串类型包含时间,格式为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
在同一查询中而不必运行其他查询?
谢谢大家!
答案 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)
显然它可用,但仅作为TIMESTAMP_FORMAT()函数下的语法替代文件记录在SQL参考中 TO_DATE()
在IBM i的Db2上不可用...
TIMESTAMP_FORMAT()
是(假设您使用的是当前支持的版本)
但是,它要求95030的前导零...
以下将起作用
select char(time(timestamp_format(right('0' concat timecolumn ,6),'HH24MISS')))
from DBNAME.TABLENAME
答案 2 :(得分:-1)
Right
代替Left
。基于右手的位置是固定的。或
SUBSTR(X,-2,2)
是秒,SUBSTR(X,-4)
是小时。或
或
LEN()
前加上SUBSTR(X,LENGTH(X)-2,2)
=>秒