数字到 HH24:MM 的转换 - SQL,Oracle
Number to HH24:MM conversion - SQL, Oracle
我们有像 810 1015 这样的数字对,表示小时和分钟。我们必须计算这对的微小差异。上面的示例将给出 125(分钟)。
你会给出什么解决方案?我考虑过转换为字符串和子字符串然后连接,但不知道它是 3 还是 4 长并且使用 IF ELSE 但会太复杂(如果不存在其他解决方案我就剩下这个了)。也想过以某种方式转换为base 60并减去,但也太复杂了。
提前致谢。
假设 3 位数字是您的数字的最小长度(否则您会遇到不明确的情况),下面的查询应该可以解决问题
select (to_date(substr(t2, 1, length(t2)-2) || ':' || substr(t2, length(t2)-1, length(t2)), 'HH:MI') -
to_date(substr(t1, 1, length(t1)-2) || ':' || substr(t1, length(t1)-1, length(t1)), 'HH:MI')) * 24 * 60 cc
from (select 810 t1, 1015 t2 from dual)
步骤是:
- 将数字分别分成两部分:最后两位数字为分钟,其余数字为小时
- 用分隔符连接两个部分(在本例中为“:”)
- 将连接转换为日期
- 将两个日期(以天为单位)之间的差异乘以 24 得到小时数,乘以 60 得到分钟数
编辑:此解决方案基于 Plirkee 对 lpad 数字的评论以获取 4 个字符的字符串,并基于 Stefano Zanini 的解决方案修改为允许 0 小时和 24 小时格式。
如果最后两位数字始终表示分钟,并且如果小时始终采用 24 小时格式:
with t(time1, time2) as (
select 810, 1015 from dual union all
select 20, 1530 from dual
),
conv(time1, time2) as (
select lpad(to_char(time1), 4, '0'),
lpad(to_char(time2), 4, '0')
from t
)
select time1,
time2,
24 * 60 * (to_date(time2, 'HH24MI') - to_date(time1, 'HH24MI')) diff_minutes
from conv;
只是另一个可以使用的调整。希望这有帮助。
SELECT
TO_CHAR(TO_DATE(LPAD(LPAD('1015',4,'0') - LPAD('810',4,'0'),4,'0'),'HH24MI'),'HH24')*60
+TO_CHAR(TO_DATE(lpad(lpad('1015',4,'0') - lpad('810',4,'0'),4,'0'),'HH24MI'),'MI') MINUTES
FROM dual;
如何使用标准日期部分(例如 01-10-2000)将数据存储为 DATA 日期类型。所以你的数据将是
01-01-2000 8:10:00
01-01-2000 10:15:00
etc
然后你可以做简单的日期数学:)
我们有像 810 1015 这样的数字对,表示小时和分钟。我们必须计算这对的微小差异。上面的示例将给出 125(分钟)。
你会给出什么解决方案?我考虑过转换为字符串和子字符串然后连接,但不知道它是 3 还是 4 长并且使用 IF ELSE 但会太复杂(如果不存在其他解决方案我就剩下这个了)。也想过以某种方式转换为base 60并减去,但也太复杂了。
提前致谢。
假设 3 位数字是您的数字的最小长度(否则您会遇到不明确的情况),下面的查询应该可以解决问题
select (to_date(substr(t2, 1, length(t2)-2) || ':' || substr(t2, length(t2)-1, length(t2)), 'HH:MI') -
to_date(substr(t1, 1, length(t1)-2) || ':' || substr(t1, length(t1)-1, length(t1)), 'HH:MI')) * 24 * 60 cc
from (select 810 t1, 1015 t2 from dual)
步骤是:
- 将数字分别分成两部分:最后两位数字为分钟,其余数字为小时
- 用分隔符连接两个部分(在本例中为“:”)
- 将连接转换为日期
- 将两个日期(以天为单位)之间的差异乘以 24 得到小时数,乘以 60 得到分钟数
编辑:此解决方案基于 Plirkee 对 lpad 数字的评论以获取 4 个字符的字符串,并基于 Stefano Zanini 的解决方案修改为允许 0 小时和 24 小时格式。
如果最后两位数字始终表示分钟,并且如果小时始终采用 24 小时格式:
with t(time1, time2) as (
select 810, 1015 from dual union all
select 20, 1530 from dual
),
conv(time1, time2) as (
select lpad(to_char(time1), 4, '0'),
lpad(to_char(time2), 4, '0')
from t
)
select time1,
time2,
24 * 60 * (to_date(time2, 'HH24MI') - to_date(time1, 'HH24MI')) diff_minutes
from conv;
只是另一个可以使用的调整。希望这有帮助。
SELECT
TO_CHAR(TO_DATE(LPAD(LPAD('1015',4,'0') - LPAD('810',4,'0'),4,'0'),'HH24MI'),'HH24')*60
+TO_CHAR(TO_DATE(lpad(lpad('1015',4,'0') - lpad('810',4,'0'),4,'0'),'HH24MI'),'MI') MINUTES
FROM dual;
如何使用标准日期部分(例如 01-10-2000)将数据存储为 DATA 日期类型。所以你的数据将是
01-01-2000 8:10:00
01-01-2000 10:15:00
etc
然后你可以做简单的日期数学:)