【问题标题】:How to convert decimal values to time values in oracle?oracle中如何将十进制值转换为时间值?
【发布时间】:2023-03-22 17:12:01
【问题描述】:

我有一个格式如下的表格:

date     | flag    |dec_time
04-MAY-21   2       0.54
04-MAY-21   5       2.18    
12-MAY-20   9       6.1
12-MAY-20   10      8
12-MAY-20   42      4
12-MAY-20   11      4.75


 

我希望输出是这样的:

date     | flag    |new_dec_time
04-MAY-21   2       00:54
04-MAY-21   5       02:18   
12-MAY-20   9       06:10
12-MAY-20   10      08:00
12-MAY-20   42      04:00
12-MAY-20   11      04.75

基本上将 dec_time 字段中的值转换为时间值,如上面在 new_dec_time 中的示例。

这是我目前的 SQL:

select to_number(replace(dec_time,'.',':')) as new_dec_time

这只是将小数点替换为分号,但不会在需要的地方添加 0。有没有一种简单的方法可以做到这一点?任何想法或建议都会有所帮助。

【问题讨论】:

  • 你确定 0.54 是 00:54,即 54 分钟;不是 00:32:24,即 32 分钟和一点点?同样,2.18 可能意味着 02:10:48,而 6.1 可能意味着 06:06:00。取决于 dec 部分是否暗示它们真的是 1 小时的以 10 为底的倍数?
  • 是的,我确定。这是因为我没有在代码中包含的逻辑,但 0.54 将是 00:54.......2.18 = 02:18.......6.1=06:10...... ....8=08:00 等

标签: sql oracle replace


【解决方案1】:

如果您需要精确的格式,切勿依赖默认的 NLS 设置。始终明确指定 NLS 参数(例如,俄语中的小数分隔符是逗号,而不是句点)。

如果您的号码仅限于有效时间,这就是查询。如果没有,你会得到看起来像时间的废话。而且Oracle没有time单独的数据类型,这就是为什么你需要自己实现对字符串的操作。

with a as (
  select 2.18 as h from dual union
  select 0.54 from dual union
  select 6.1 from dual
)
select
  to_char(h, '00D00',
  'NLS_NUMERIC_CHARACTERS='': ''') as tm
from a
|商标 | | :----- | | 00:54 | | 02:18 | | 06:10 |

db小提琴here

【讨论】:

  • 如果前导空格是个问题,那么您可以使用 FM 格式修饰符来抑制它 - db<>fiddle
【解决方案2】:

你想要一个字符串结果,所以不要使用to_number()

你想要lpad():

select lpad(replace(dec_time, '.', ':'), 5, '0')

【讨论】:

    猜你喜欢
    • 2015-06-04
    • 2017-08-27
    • 1970-01-01
    • 2023-01-16
    • 2020-11-15
    • 2023-03-30
    • 1970-01-01
    • 2017-04-24
    • 2014-02-05
    相关资源
    最近更新 更多