这是一种非常丑陋的方法,第一部分并没有完全受到 OP 的质疑,但它提供了一种通过减去 2 个日期字段来获得结果的方法——在我的例子中,CREATED_DATE
和今天由 表示SYSDATE
:
SELECT FLOOR(ABS(MONTHS_BETWEEN(CREATED_DATE, SYSDATE)) / 12) || ' years, '
|| (FLOOR(ABS(MONTHS_BETWEEN(CREATED_DATE, SYSDATE))) -
(FLOOR(ABS(MONTHS_BETWEEN(CREATED_DATE, SYSDATE)) / 12)) * 12) || ' months, '
-- we take total days - years(as days) - months(as days) to get remaining days
|| FLOOR((SYSDATE - CREATED_DATE) - -- total days
(FLOOR((SYSDATE - CREATED_DATE)/365)*12)*(365/12) - -- years, as days
-- this is total months - years (as months), to get number of months,
-- then multiplied by 30.416667 to get months as days (and remove it from total days)
FLOOR(FLOOR(((SYSDATE - CREATED_DATE)/365)*12 - (FLOOR((SYSDATE - CREATED_DATE)/365)*12)) * (365/12)))
|| ' days, '
-- Here, we can just get the remainder decimal from total days minus
-- floored total days and multiply by 24
|| FLOOR(
((SYSDATE - CREATED_DATE)-(FLOOR(SYSDATE - CREATED_DATE)))*24
)
|| ' hours, '
-- Minutes just use the unfloored hours equation minus floored hours,
-- then multiply by 60
|| ROUND(
(
(
((SYSDATE - CREATED_DATE)-(FLOOR(SYSDATE - CREATED_DATE)))*24
) -
FLOOR((((SYSDATE - CREATED_DATE)-(FLOOR(SYSDATE - CREATED_DATE)))*24))
)*60
)
|| ' minutes'
AS AGE FROM MyTable`
它以 x 年、x 月、x 天、x 小时、x 分钟的形式提供输出。可以通过更改连接的字符串来重新格式化它。
为了更直接地回答这个问题,我继续写了如何获得总小时数和分钟数hours.minutes
:
select
((FLOOR(end_date - start_date))*24)
|| '.' ||
ROUND(
(
(
((end_date - start_date)-(FLOOR(end_date - start_date)))*24
) -
FLOOR((((end_date - start_date)-(FLOOR(end_date - start_date)))*24))
)*60
)
from
come_leav;