甲骨文-嗯mm ss到hh:mm:ss带有一个奇异符号

时间:2018-12-12 15:53:41

标签: sql oracle

我有一个Oracel数据库,其中包含两列,格式为hhmmss。所以221000代表22:10:00。

我想将其设置为正确的时间格式。问题在于存在值240000,应将其更改为235959。此外,省略了前导零。

有人知道该怎么做吗?

问候

4 个答案:

答案 0 :(得分:1)

您可以尝试:

select replace(to_char(t, '00,00,00'), ',', ':')

这不处理24:00:00,但这似乎是一个有效时间。您可以使用case处理此问题:

select (case when t = 240000 then '23:59:59'  -- I would use '00:00:00'
             else replace(to_char(t, '00,00,00'), ',', ':')
        end)

答案 1 :(得分:0)

您可以使用case表达式来显式处理该用例。对于其他用户,您可以将此字符串转换为日期,然后按以下方式格式化日期:

SELECT CASE col
       WHEN '240000' THEN '23:59:59'
       ELSE TO_CHAR(TO_DATE(LPAD(col, 6, '0'), 'hh24miss'), 'hh24:mi:ss')
       ENDi
FROM   mytable

答案 2 :(得分:0)

假设:

  • 您的表中有一个VARCHAR列,其中的日期以yyyymmdd表示
  • 您的表中有一个VARCHAR或INT列,其中以hh24miss表示时间

您真正应该做的:

ALTER TABLE ADD proper_date DATETIME;
UPDATE table SET proper_date = TO_DATE(datecol || LPAD(timecol, 6, '0'), 'yyyymmddhh24miss');

如果表中有一个保存日期的日期时间,和一个有时间的int或varchar值:

UPDATE table SET the_date = TO_DATE(TO_CHAR(datecol, 'yyyymmdd') || LPAD(timecol, 6, '0'), 'yyyymmddhh24miss');

然后放置分隔的列-面对旨在容纳这些内容的数据类型,这总是一个糟糕的主意

答案 3 :(得分:0)

最简单的方法可能是将小时数与分钟和秒分别转换,如下所示:

to_date(substr(t,-4),'miss') + to_number(substr(t,1,length(t)-4))/24

要注意的一个关键事实是,对于小时数> = 24的情况,结果日期将比那些小时数较少的时间晚一天或更长时间,因此从240000中减去转换后的值230000将导致一小时的差异,因为必填。