Oracle按小时统计记录数:varchar2类型时间戳转换报错如何解决
问题根因
- 你直接对字符串类型的
reqts调用时间格式化函数to_char,Oracle会默认尝试把字符串转成日期类型再格式化,默认用的是你会话的DD-MON-RRRR格式,和你的字符串格式不匹配,所以报格式错误 - 你的时间字符串包含毫秒,
to_date不支持毫秒处理,需要用to_timestamp做转换,且转换模板要完全匹配字符串的分隔符、格式位
可行实现方案
先测试转换逻辑(仅查前10条验证格式是否正确)
SELECT to_char(to_timestamp(reqts, 'yyyy-mm-dd hh24:mi:ss:ff3'), 'mm/dd/yyyy hh24') AS DATE_HR FROM idcreqresplog WHERE logdate > trunc(SYSDATE -2) AND logtypeid in (2,4) AND ROWNUM <= 10;
完整按小时统计事务数量的语句
SELECT to_char(to_timestamp(reqts, 'yyyy-mm-dd hh24:mi:ss:ff3'), 'mm/dd/yyyy hh24') AS DATE_HR, count(*) AS transaction_count FROM idcreqresplog WHERE logdate > trunc(SYSDATE -2) AND logtypeid in (2,4) -- 可选:如果存在格式不符合的脏数据,加上下面这行过滤异常数据避免报错 -- AND validate_conversion(reqts AS TIMESTAMP, 'yyyy-mm-dd hh24:mi:ss:ff3') = 1 GROUP BY to_char(to_timestamp(reqts, 'yyyy-mm-dd hh24:mi:ss:ff3'), 'mm/dd/yyyy hh24') ORDER BY DATE_HR;
格式说明
- 转换模板
yyyy-mm-dd hh24:mi:ss:ff3完全匹配你给出的示例字符串格式,最后一位的ff3对应3位毫秒,分隔符用冒号和字符串里的秒与毫秒的分隔符一致 - 转换逻辑为字符串转时间戳→时间戳转指定格式的字符串,避开默认NLS格式的干扰
内容的提问来源于stack exchange,提问作者NoBullMan
相关产品推荐
相关产品推荐

