oracle - 在 Oracle 中以非日期格式比较时间
问题描述
我用秒表测量时间,从几分钟到几小时不等([hh:m]m:ss.ss)。我以为 Oracle 会有一些方法来比较时间,但我无法在他们的文档中找到它
我可以尝试使用某种正则表达式来计算秒数,但提供的格式并不统一。这是一个例子:
TIME
----------
01:42:25.76
27:54.92
56:31.55
2:49.38
假设我想将此时间与诸如此类的计分表进行比较
TIME | SCORE
----------------
10:00.00 | 100
20:00.00 | 85
30:00.00 | 70
40:00.00 | 55
50:00.00 | 40
01:00:00.00 | 25
每个时间的分数是根据他们达到的阈值授予的,因此需要将我们测量的时间与评分表中的时间进行比较(如果时间在 20 分钟到 30 分钟之间,则得分为 70 分)
TIME | SCORE
----------------
01:42:25.76 | 0
27:54.92 | 70
56:31.55 | 25
2:49.38 | 100
解决方案
您的时间应该被视为间隔,以便可以将它们作为正常数据进行操作:
WITH cteBase_scoring AS (SELECT INTERVAL '10:00.00' MINUTE TO SECOND AS TIME, 100 AS SCORE FROM DUAL UNION ALL
SELECT INTERVAL '20:00.00' MINUTE TO SECOND, 85 FROM DUAL UNION ALL
SELECT INTERVAL '30:00.00' MINUTE TO SECOND, 70 FROM DUAL UNION ALL
SELECT INTERVAL '40:00.00' MINUTE TO SECOND, 55 FROM DUAL UNION ALL
SELECT INTERVAL '50:00.00' MINUTE TO SECOND, 40 FROM DUAL UNION ALL
SELECT INTERVAL '01:00:00.00' HOUR TO SECOND, 25 FROM DUAL),
cteScoring AS (SELECT LAG(bs.TIME, 1, INTERVAL '00:00' MINUTE TO SECOND)
OVER (ORDER BY bs.TIME) AS FROM_TIME,
bs.TIME AS TO_TIME,
bs.SCORE
FROM cteBase_scoring bs),
cteTimes AS (SELECT INTERVAL '01:42:25.76' HOUR TO SECOND AS TIME FROM DUAL UNION ALL
SELECT INTERVAL '27:54.92' MINUTE TO SECOND FROM DUAL UNION ALL
SELECT INTERVAL '56:31.55' MINUTE TO SECOND FROM DUAL UNION ALL
SELECT INTERVAL '02:49.38' MINUTE TO SECOND FROM DUAL)
SELECT t.TIME, NVL(s.SCORE, 0) AS SCORE
FROM cteTimes t
LEFT OUTER JOIN cteScoring s
ON t.TIME > s.FROM_TIME AND
t.TIME <= s.TO_TIME;
推荐阅读
- javascript - 定时滑动文本框
- vue.js - 如何删除 !important CSS 属性?
- java - JFrame 上的多行标题
- node.js - Node.sj TypeError:req.check 不是函数
- c# - 使用 C# 从 json 文件中提取特定数据
- java - 从 Maven exec 连接到 MongoDB 失败,但不是从 jar
- kotlin - 如何在文件路径中运行带有空格的 bat 文件?
- google-cloud-firestore - 带有绑定的VuexFire同步不起作用
- c# - 在 C# 中迭代 spark 数据框列
- palantir-foundry - 是否可以通过 Foundry 中的编辑表单的派生值来更改对象的标题属性?