提问人:Landon Statis 提问时间:9/28/2023 更新时间:9/29/2023 访问量:29
Oracle - 从字符串中删除特定空格
Oracle - Remove specific space from string
问:
我们有一些未格式化的数据已经传递给我们,需要将其转换为分钟:
2hr
2hr 30min
3 hours
3 hr
3 hrs
3hr
3hrs
4 hours
4 hrs
4 hrs 10 mins
6 hrs
我想做的是从字符串中删除第一个空格,这将导致:
2hr
2hr 30min
3hours
3hr
3hrs
3hr
3hrs
4hours
4hrs
4hrs 10 mins
6hrs
然后,我可以取第一个“单词”,并通过删除所有非数字并将其乘以 60 将其转换为分钟。之后,我可以在第一个单词之后取每个单词并将其添加到该结果中。但我只需要删除第一个空格。
我REGEXP_REPLACE思考,但不确定如何仅使用第一个空间。
非常感谢!
答:
2赞
MT0
9/28/2023
#1
您不需要删除空格。您可以找到后跟零或多个空格的数字,然后是小时和分钟。h
m
SELECT duration,
COALESCE(TO_NUMBER(REGEXP_SUBSTR(duration, '(\d+)\s*h', 1, 1, 'i', 1)), 0) * 60
+ COALESCE(TO_NUMBER(REGEXP_SUBSTR(duration, '(\d+)\s*m', 1, 1, 'i', 1)), 0)
AS minutes
FROM table_name;
或十进制小时和分钟:
SELECT duration,
COALESCE(TO_NUMBER(REGEXP_SUBSTR(duration, '(\d+\.?\d*|\.\d+)\s*h', 1, 1, 'i', 1)), 0) * 60
+ COALESCE(TO_NUMBER(REGEXP_SUBSTR(duration, '(\d+\.?\d*|\.\d+)\s*m', 1, 1, 'i', 1)), 0)
AS minutes
FROM table_name;
其中,对于示例数据:
CREATE TABLE table_name (duration) AS
SELECT '2hr' FROM DUAL UNION ALL
SELECT '2hr 30min' FROM DUAL UNION ALL
SELECT '3 hours' FROM DUAL UNION ALL
SELECT '3 hr' FROM DUAL UNION ALL
SELECT '3 hrs' FROM DUAL UNION ALL
SELECT '3hr' FROM DUAL UNION ALL
SELECT '3hrs' FROM DUAL UNION ALL
SELECT '4 hours' FROM DUAL UNION ALL
SELECT '4 hrs' FROM DUAL UNION ALL
SELECT '4 hrs 10 mins' FROM DUAL UNION ALL
SELECT '6 hrs' FROM DUAL UNION ALL
SELECT '1.5 hrs' FROM DUAL UNION ALL
SELECT '.25 hrs' FROM DUAL UNION ALL
SELECT '1.1m' FROM DUAL;
输出:
期间 | 纪要 |
---|---|
2小时 | 120 |
2小时30分钟 | 150 |
3小时 | 180 |
3 小时 | 180 |
3 小时 | 180 |
3小时 | 180 |
3小时 | 180 |
4小时 | 240 |
4 小时 | 240 |
4 小时 10 分钟 | 250 |
6 小时 | 360 |
1.5 小时 | 90 |
.25 小时 | 15 |
1.1米 | 1.1 |
评论
0赞
Landon Statis
9/28/2023
很有意思。确实注意到一些值是这样的:1.5 小时,它将其转换为 300 分钟,而它应该是 90........
0赞
MT0
9/29/2023
@LandonStatis 这不在您的示例数据中。您可以将正则表达式更改为(如果您有小数分钟,则类似分钟),它应该处理小数。如果得到(没有前导整数部分),则使用 ''(\d+\.?\d*|\.\d+)\s*h'。(\d+\.?\d*)\s*h
.5hrs
0赞
Landon Statis
9/30/2023
棒。非常感谢!
评论