Oracle에는 기간을 변환 할 수있는 간격 데이터 유형이 있지만 실제로 형식을 지정할 수는 없습니다. 가장 간단한 방법은 mod와 trunc를 사용하여 값을 전체 시간과 분, 남은 초로 나누는 것입니다.
일부 샘플 데이터 :
with t (duration) as (
select 59 from dual
union all select 60 from dual
union all select 61 from dual
union all select 3599 from dual
union all select 3600 from dual
union all select 86399 from dual
)
select duration,
numtodsinterval(duration, 'SECOND') as interval_value,
'PT'
|| case when trunc(duration/3600) > 0 then trunc(duration/3600) || 'H' end
|| case when trunc(duration/3600) > 0 or trunc(mod(duration, 3600)/60) > 0
then trunc(mod(duration, 3600)/60) || 'M' end
|| trunc(mod(duration, 60)) || 'S' as iso_value
from t;
DURATION INTERVAL_VAL ISO_VALUE
---------- ------------ ------------
59 0 0:0:59.0 PT59S
60 0 0:1:0.0 PT1M0S
61 0 0:1:1.0 PT1M1S
3599 0 0:59:59.0 PT59M59S
3600 0 1:0:0.0 PT1H0M0S
86399 0 23:59:59.0 PT23H59M59S
지속 시간은 24 시간을 초과 할 수 없으며 전체 초만 원한다고 가정합니다. 필요한 경우 더 긴 기간과 더 높은 정밀도를 처리 할 수 있습니다.
나는 또한 당신이 가장 높은 선택적 부분을 제외하고 싶다고 생각하고 있습니다. 그래서 당신은 0H를 보여주지 않을 것입니다. 그러나 시간을 표시 했으므로 0이더라도 분과 초를 표시하고 싶습니다. 그렇지 않은 경우 case 문을 조정 (또는 제거) 할 수 있습니다.
항상 세 부분을 모두 표시하려면 :
select duration,
numtodsinterval(duration, 'SECOND') as interval_value,
'PT' || trunc(duration/3600) || 'H'
|| trunc(mod(duration, 3600)/60) || 'M'
|| trunc(mod(duration, 60)) || 'S' as iso_value
from t;
DURATION INTERVAL_VAL ISO_VALUE
---------- ------------ ------------
59 0 0:0:59.0 PT0H0M59S
60 0 0:1:0.0 PT0H1M0S
61 0 0:1:1.0 PT0H1M1S
3599 0 0:59:59.0 PT0H59M59S
3600 0 1:0:0.0 PT1H0M0S
86399 0 23:59:59.0 PT23H59M59S
제로 부품을 표시하지 않으려면 :
select duration,
numtodsinterval(duration, 'SECOND') as interval_value,
'PT'
|| case when trunc(duration/3600) > 0 then trunc(duration/3600) || 'H' end
|| case when trunc(mod(duration, 3600)/60) > 0 then trunc(mod(duration, 3600)/60) || 'M' end
|| case when trunc(mod(duration, 60)) > 0 then trunc(mod(duration, 60)) || 'S' end
as iso_value
from t;
DURATION INTERVAL_VAL ISO_VALUE
---------- ------------ ------------
59 0 0:0:59.0 PT59S
60 0 0:1:0.0 PT1M
61 0 0:1:1.0 PT1M1S
3599 0 0:59:59.0 PT59M59S
3600 0 1:0:0.0 PT1H
86399 0 23:59:59.0 PT23H59M59S
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다