如何在oracle中以小时和分钟的形式获取开始日期和结束日期之间的日期差异
How to get the date difference between start date and end date in oracle as hours and minutes
我有一个场景,例如,我的 start_date ='12-SEP-2018 00:01:00' 和 End_date ='13-SEP-2018 14:55:00' 。必须在小时和分钟中找出 2 个日期之间的差异,例如“12:20”。这个必须在oracle数据库中实现。我尝试使用以下逻辑:
SELECT
24 * (to_date('2009-07-07 22:00', 'YYYY-MM-DD hh24:mi') - to_date(
'2009-07-07 19:30', 'YYYY-MM-DD hh24:mi')) diff_hours
从
双;
我能够得到时差,但无法得到分钟。
CREATE TABLE table_name ( start_date DATE, end_date DATE );
INSERT INTO table_name VALUES ( TIMESTAMP '2009-07-07 19:30:00', TIMESTAMP '2009-07-07 22:00:00' );
然后您可以从另一个中减去一个并将其转换为 DAY TO SECOND
间隔,然后只是 EXTRACT
时间的组成部分:
SELECT EXTRACT( DAY FROM difference ) AS days,
EXTRACT( HOUR FROM difference ) AS hours,
EXTRACT( MINUTE FROM difference ) AS minutes,
EXTRACT( SECOND FROM difference ) AS seconds
FROM (
SELECT ( end_date - start_date ) DAY TO SECOND AS difference
FROM table_name
);
输出:
DAYS | HOURS | MINUTES | SECONDS
---: | ----: | ------: | ------:
0 | 2 | 30 | 0
或者您可以使用算术计算值:
SELECT TRUNC( 24 * ( end_date - start_date ) ) AS hours,
TRUNC( MOD( 24 * 60 * ( end_date - start_date ), 60 ) ) AS minutes,
ROUND( MOD( 24 * 60 * 60 * ( end_date - start_date ), 60 ) ) AS seconds
FROM table_name;
输出:
HOURS | MINUTES | SECONDS
----: | ------: | ------:
2 | 30 | 0
db<>fiddle here
由于您需要一个字符串值,基于您的查询尝试的另一种方法是将两个日期值之间的差异(这是一个数值,它们之间的天数,包括小数天数)添加到任意固定日期;然后将结果转换为字符串:
SELECT to_char(date '0001-01-01'
+ (to_date('2009-07-07 22:00', 'YYYY-MM-DD hh24:mi') - to_date( '2009-07-07 19:30', 'YYYY-MM-DD hh24:mi')),
'HH24:MI') as diff
FROM dual;
DIFF
-----
02:30
如果差异可能超过 24 小时,那么您需要决定如何报告;如果你想把天数作为一个单独的数字,那么你仍然可以使用这种方法,但在格式化为字符串之前需要从差异中减去一个(如果你的固定日期是第一个):
SELECT to_char(date '0001-01-01'
+ (to_date('2009-07-08 22:00', 'YYYY-MM-DD hh24:mi') - to_date( '2009-07-07 19:30', 'YYYY-MM-DD hh24:mi'))
- 1,
'DDD:HH24:MI') as diff
FROM dual;
DIFF
---------
001:02:30
如果您希望 'hours' 值更高 - 例如这个例子中的'26:30' - 然后它变得更加复杂;我看到@MTO 已经添加了 'arithmetic' 方法,所以我不会重复。但是走 extract()
路线可能会更好(无论如何你应该考虑,因为它更灵活和优雅......)
我有一个场景,例如,我的 start_date ='12-SEP-2018 00:01:00' 和 End_date ='13-SEP-2018 14:55:00' 。必须在小时和分钟中找出 2 个日期之间的差异,例如“12:20”。这个必须在oracle数据库中实现。我尝试使用以下逻辑:
SELECT 24 * (to_date('2009-07-07 22:00', 'YYYY-MM-DD hh24:mi') - to_date( '2009-07-07 19:30', 'YYYY-MM-DD hh24:mi')) diff_hours 从 双; 我能够得到时差,但无法得到分钟。
CREATE TABLE table_name ( start_date DATE, end_date DATE );
INSERT INTO table_name VALUES ( TIMESTAMP '2009-07-07 19:30:00', TIMESTAMP '2009-07-07 22:00:00' );
然后您可以从另一个中减去一个并将其转换为 DAY TO SECOND
间隔,然后只是 EXTRACT
时间的组成部分:
SELECT EXTRACT( DAY FROM difference ) AS days,
EXTRACT( HOUR FROM difference ) AS hours,
EXTRACT( MINUTE FROM difference ) AS minutes,
EXTRACT( SECOND FROM difference ) AS seconds
FROM (
SELECT ( end_date - start_date ) DAY TO SECOND AS difference
FROM table_name
);
输出:
DAYS | HOURS | MINUTES | SECONDS ---: | ----: | ------: | ------: 0 | 2 | 30 | 0
或者您可以使用算术计算值:
SELECT TRUNC( 24 * ( end_date - start_date ) ) AS hours,
TRUNC( MOD( 24 * 60 * ( end_date - start_date ), 60 ) ) AS minutes,
ROUND( MOD( 24 * 60 * 60 * ( end_date - start_date ), 60 ) ) AS seconds
FROM table_name;
输出:
HOURS | MINUTES | SECONDS ----: | ------: | ------: 2 | 30 | 0
db<>fiddle here
由于您需要一个字符串值,基于您的查询尝试的另一种方法是将两个日期值之间的差异(这是一个数值,它们之间的天数,包括小数天数)添加到任意固定日期;然后将结果转换为字符串:
SELECT to_char(date '0001-01-01'
+ (to_date('2009-07-07 22:00', 'YYYY-MM-DD hh24:mi') - to_date( '2009-07-07 19:30', 'YYYY-MM-DD hh24:mi')),
'HH24:MI') as diff
FROM dual;
DIFF
-----
02:30
如果差异可能超过 24 小时,那么您需要决定如何报告;如果你想把天数作为一个单独的数字,那么你仍然可以使用这种方法,但在格式化为字符串之前需要从差异中减去一个(如果你的固定日期是第一个):
SELECT to_char(date '0001-01-01'
+ (to_date('2009-07-08 22:00', 'YYYY-MM-DD hh24:mi') - to_date( '2009-07-07 19:30', 'YYYY-MM-DD hh24:mi'))
- 1,
'DDD:HH24:MI') as diff
FROM dual;
DIFF
---------
001:02:30
如果您希望 'hours' 值更高 - 例如这个例子中的'26:30' - 然后它变得更加复杂;我看到@MTO 已经添加了 'arithmetic' 方法,所以我不会重复。但是走 extract()
路线可能会更好(无论如何你应该考虑,因为它更灵活和优雅......)