2017-10-27 46 views
5

मैं ओरेकल एसक्यूएल के साथ काम करता हूं और मेरे पास 3 कॉलम के साथ एक टेबल है: Process, Start Date और End Date। मैं हर प्रक्रिया के लिए समय अवधि की गणना करना चाहता हूं।कई दिनों के बीच मानव पठनीय समय बीत गया

मैं इस क्वेरी के लिए इस्तेमाल किया:

select 
(enddate.date_value - startdate.date_value) as duration 
from dual 

और परिणाम दिनों में है।

उदाहरण के लिए: आरंभ तिथि 30.3.2016 17:14:53 है और समाप्ति तिथि 8.7.2016 14:51:21

है जब मैं क्वेरी का उपयोग, परिणाम 99.90032407407407407407407407407407407407 है, लेकिन मैं इस तरह परिणाम हैं: 3 months, 7 days, 21 hours, 36 minutes, 28 seconds

मैं यह कैसे कर सकता हूं?

+0

समस्याओं जैसे ही आप दिनों की तुलना में बड़ी इकाईयों चाहते हैं, तो आप मिल गया है। आपको यह चुनना होगा कि क्या आप झूठ बोलने जा रहे हैं और मानक लंबाई के महीनों (उदाहरण के लिए सभी 30 दिन) हैं या आपके पास ऐसी स्थिति है जहां "3 महीने, 7 दिन, ..." बिल्कुल वास्तविक वास्तविक अवधि का प्रतिनिधित्व कर सकते हैं * जब * वर्ष में अवधि हुई। न तो विशेष रूप से आकर्षक है।क्या आप वाकई चाहते हैं कि आपको वास्तव में जो चाहिए वह चाहिए, और जो लोग इसके लिए पूछ रहे हैं वे इस तरह के व्यापार-बंद समझते हैं? –

+0

@Damien_The_Unbeliever, मैं आपसे सहमत हूं, यदि आप केवल एक दिन में कनवर्ट करना चाहते हैं, लेकिन यदि आप 2 तिथियों के बीच अवधि पुनर्वितरण चाहते हैं तो आपको प्रति माह एक निश्चित संख्या की आवश्यकता नहीं है (उदाहरण के लिए सभी 30 दिन) या एक निश्चित प्रति वर्ष दिन की संख्या, मेरा प्रस्ताव देखें (मुझे यकीन है कि हम इसे सरल/अनुकूलित कर सकते हैं, लेकिन यह काम लगता है!) – Indent

+0

@ इंडेंट - जो मैं इंगित करने की कोशिश कर रहा था वह यह है कि "3 महीने, 7 दिन, ..." यदि आप निश्चित लंबाई महीनों को अपनाते नहीं हैं तो विभिन्न अवधि का प्रतिनिधित्व कर सकते हैं। अर्थात। यह 1 फरवरी और 8 मई 2000 के बीच की अवधि है और यह 97 दिनों की वास्तविक अवधि का प्रतिनिधित्व करता है। एक साल बाद उन तारीखों के बीच, यह 96 दिनों का प्रतिनिधित्व करता है। और ओपीएस उदाहरण में, यह 99 दिनों का प्रतिनिधित्व करता है। –

उत्तर

1

दो DATE मानों के बीच अंतर number दिनों की संख्या का प्रतिनिधित्व करता है। आप interval चाहते हैं, यह TIMESTAMP मानों का उपयोग करके किया जा सकता है।

select cast(enddate as timestamp) - cast(startdate as timestamp) 
from the_table 

subtracting a timestamp from a timestamp का परिणाम एक अंतराल है।

प्रारूपinterval मूल्य ओरेकल में काफी मुश्किल है। उदाहरण देखें format interval with to_char

+0

वास्तव में यह केवल एक को समाप्त करने के लिए पर्याप्त है, या तो 'enddate' या' startdate'। –

2

यह जटिल क्वेरी (दिन !! लिए specialy):

एक सही Day मैं मूल तारीख को Month और 12 * Year जोड़ने की गणना करने के लिए।

with dates as(
select 
    sysdate  as d1, 
    sysdate-99.90032407407407407407407407407407407407-365 as d2 
from 
    dual 
), 
dates_parts as (
SELECT 
    d1, 
    d2, 
    EXTRACT(YEAR FROM (d1 - d2) YEAR TO MONTH) as Year, 
    EXTRACT(MONTH FROM (d1 - d2) YEAR TO MONTH) as Month, 
    EXTRACT(DAY FROM (d1 - d2) DAY TO SECOND) as Day, 
    EXTRACT(HOUR FROM cast(d1 as timestamp) - cast(d2 as timestamp)) as Hour, 
    EXTRACT(MINUTE FROM cast(d1 as timestamp) - cast(d2 as timestamp)) as Minute,  
    EXTRACT(SECOND FROM cast(d1 as timestamp) - cast(d2 as timestamp)) as Second 
FROM dates 
) 
select 
    dates_parts.Year, 
    dates_parts.Month, 
    dates_parts.Day, 
    dates_parts.Hour, 
    dates_parts.Minute, 
    dates_parts.Second, 
    EXTRACT(DAY FROM (d1 - ADD_MONTHS(d2,Month+Year*12)) DAY TO SECOND) as Day_Corrected 
from 
    dates_parts 

अलग तिथि भाग का उत्पादन करेगा:

| YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | DAY_CORRECTED | 
|------|-------|-----|------|--------|--------|---------------| 
| 1 |  3 | 464 | 21 |  36 |  28 |    7 | 
1

मेरे पिछले जवाब के आधार पर आप एक 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 | 
संबंधित मुद्दे