मेरे पिछले जवाब के आधार पर आप एक Oracle समारोह sinceHumanReadable
बना सकते हैं:
https://momentjs.com/docs/#/plugins/preciserange/ से उदाहरण का उत्पादन एक ही परिणाम
moment("2014-01-01 12:00:00").preciseDiff("2015-03-04 16:05:06");
// 1 year 2 months 3 days 4 hours 5 minutes 6 seconds
http://sqlfiddle.com/#!4/d6783/1
create or replace FUNCTION sinceHumanReadable(start_date IN date,end_date IN date)
RETURN VARCHAR2
IS result VARCHAR2(255);
BEGIN
with
dates_parts as (
SELECT
EXTRACT(YEAR FROM (end_date - start_date) YEAR TO MONTH) as Year,
EXTRACT(MONTH FROM (end_date - start_date) YEAR TO MONTH) as Month,
EXTRACT(HOUR FROM cast(end_date as timestamp) - cast(start_date as timestamp)) as Hour,
EXTRACT(MINUTE FROM cast(end_date as timestamp) - cast(start_date as timestamp)) as Minute,
EXTRACT(SECOND FROM cast(end_date as timestamp) - cast(start_date as timestamp)) as Second
FROM dual
),
dates_parts_with_day as (
select
Year,Month,Hour,Minute,Second,
EXTRACT(DAY FROM (end_date - ADD_MONTHS(start_date,Month+Year*12)) DAY TO SECOND) as Day
from dates_parts
)
select
decode(dates_parts_with_day.Year, 0,'', dates_parts_with_day.Year || ' years ')||
decode(dates_parts_with_day.Month,0,'', dates_parts_with_day.Month || ' months ')||
decode(dates_parts_with_day.Day,0,'', dates_parts_with_day.Day || ' days ')||
decode(dates_parts_with_day.Hour,0,'', dates_parts_with_day.Hour || ' hours ')||
decode(dates_parts_with_day.Minute,0,'', dates_parts_with_day.Minute || ' minutes ')||
dates_parts_with_day.Second || ' seconds'
into result
from
dates_parts_with_day;
RETURN(result);
END sinceHumanReadable;
GO
क्वेरी
with dates as (
select sysdate-99.90032407407407407407407407407407407407 as d1,sysdate as d2 from dual
union all
select to_date('2016-03-30 17:14:53','yyyy-mm-dd hh24:mi:ss') as d1,to_date('2016-07-08 14:51:21','yyyy-mm-dd hh24:mi:ss') as d2 from dual
union all
select to_date('2014-01-01 12:00:00','yyyy-mm-dd hh24:mi:ss') as d1,to_date('2015-03-04 16:05:06','yyyy-mm-dd hh24:mi:ss') as d2 from dual
union all
select sysdate as d1,add_months(sysdate,35) as d2 from dual
union all
select sysdate as d1,sysdate as d2 from dual
)
select
d1,d2,
sinceHumanReadable(d1,d2) as since
from
dates;
का उत्पादन करेगा:
| D1 | D2 | SINCE |
|----------------------|----------------------|-----------------------------------------------------|
| 2017-07-19T17:50:00Z | 2017-10-27T15:26:28Z | 3 months 7 days 21 hours 36 minutes 28 seconds |
| 2016-03-30T17:14:53Z | 2016-07-08T14:51:21Z | 3 months 7 days 21 hours 36 minutes 28 seconds |
| 2014-01-01T12:00:00Z | 2015-03-04T16:05:06Z | 1 years 2 months 3 days 4 hours 5 minutes 6 seconds |
| 2017-10-27T15:26:28Z | 2020-09-27T15:26:28Z | 2 years 11 months 0 seconds |
| 2017-10-27T15:26:28Z | 2017-10-27T15:26:28Z | 0 seconds |
समस्याओं जैसे ही आप दिनों की तुलना में बड़ी इकाईयों चाहते हैं, तो आप मिल गया है। आपको यह चुनना होगा कि क्या आप झूठ बोलने जा रहे हैं और मानक लंबाई के महीनों (उदाहरण के लिए सभी 30 दिन) हैं या आपके पास ऐसी स्थिति है जहां "3 महीने, 7 दिन, ..." बिल्कुल वास्तविक वास्तविक अवधि का प्रतिनिधित्व कर सकते हैं * जब * वर्ष में अवधि हुई। न तो विशेष रूप से आकर्षक है।क्या आप वाकई चाहते हैं कि आपको वास्तव में जो चाहिए वह चाहिए, और जो लोग इसके लिए पूछ रहे हैं वे इस तरह के व्यापार-बंद समझते हैं? –
@Damien_The_Unbeliever, मैं आपसे सहमत हूं, यदि आप केवल एक दिन में कनवर्ट करना चाहते हैं, लेकिन यदि आप 2 तिथियों के बीच अवधि पुनर्वितरण चाहते हैं तो आपको प्रति माह एक निश्चित संख्या की आवश्यकता नहीं है (उदाहरण के लिए सभी 30 दिन) या एक निश्चित प्रति वर्ष दिन की संख्या, मेरा प्रस्ताव देखें (मुझे यकीन है कि हम इसे सरल/अनुकूलित कर सकते हैं, लेकिन यह काम लगता है!) – Indent
@ इंडेंट - जो मैं इंगित करने की कोशिश कर रहा था वह यह है कि "3 महीने, 7 दिन, ..." यदि आप निश्चित लंबाई महीनों को अपनाते नहीं हैं तो विभिन्न अवधि का प्रतिनिधित्व कर सकते हैं। अर्थात। यह 1 फरवरी और 8 मई 2000 के बीच की अवधि है और यह 97 दिनों की वास्तविक अवधि का प्रतिनिधित्व करता है। एक साल बाद उन तारीखों के बीच, यह 96 दिनों का प्रतिनिधित्व करता है। और ओपीएस उदाहरण में, यह 99 दिनों का प्रतिनिधित्व करता है। –