Найти количество дней между двумя датами varchar в Oracle SQL

Я новичок в Oracle SQL, и я хочу иметь два вопроса.

Во-первых, я хочу найти количество дней между двумя событиями (поэтому, когда они да). Эти две даты в настоящее время varchars(!).

Псевдокод:
Если request да и sales да, вычесть sales_date из request_date.

Данные выглядят следующим образом:

Id  request request_date    sales          sales_date 
1   yes     2 feb14         yes             3 feb 14
2   yes     3 feb 14        no              3 feb 14
3   no      4 feb 14        no              5 feb 14
4   no      4 feb 14        yes             6 feb 14

И в идеале я хочу, чтобы это был результат:

Id  request request_date    sales   sales_date   days_between_request_sales
1    yes    2 feb14         yes       3 feb 14          1 

Мой второй вопрос заключается в том, что если у меня есть все эти результаты, то как я могу получить среднее значение всех дат?

3 ответа

  1. Вы можете попробовать использовать:

    select trunc(to_date(sales_date,'dd-mm-yy') - to_date(request_date, 'dd-mm-yy')) as days 
    from <yourtable>
    where sales = 'yes'
    and request = 'yes'
    

    демонстрация:

    select trunc(to_date('3 feb 14','dd-mm-yy') - to_date('1 feb 14', 'dd-mm-yy')) as days 
    from dual
    

    Выход:

        DAYS
    ----------
         2
    

    Средний:

    select avg(trunc(to_date(sales_date,'dd-mm-yy') - to_date(request_date, 'dd-mm-yy'))) as Average
        from <yourtable>
        where sales = 'yes'
        and request = 'yes'
    
  2. Скажем, у вас есть такой стол:

    create table yourTable(Id, request, request_date, sales, sales_date) as ( 
        select 1   ,'yes',     '2 feb 14',        'yes'  ,           '3 feb 14' from dual union all
        select 2   ,'yes',     '3 feb 14',        'no'   ,           '3 feb 14' from dual union all
        select 3   ,'no' ,     '4 feb 14',        'no'   ,           '5 feb 14' from dual union all
        select 4   ,'no' ,     '4 feb 14',        'no'   ,           '6 feb 14' from dual
    )
    

    Предполагая, что ваши строки представляют даты всегда в формате, который вы показали, можно использовать:

    select Id, request, request_date, sales, sales_date,
           to_date(sales_date, 'dd mon rr') - to_date(request_date, 'dd mon rr') as days_between_request_sales
    from yourTable
    where sales = 'yes'
      and request = 'yes'
    

    Чтобы вычислить среднее из этих результирующих чисел дней od, вы можете просто использовать AVG:

    select avg (to_date(sales_date, 'dd mon rr') - to_date(request_date, 'dd mon rr') ) as average
    from yourTable
    where sales = 'yes'
     and request = 'yes'
    
  3. Я не понял, как он работал с предыдущим to_date(sales_date,’dd-mm-yyyy’) совершенно неправильно, так как ваш формат dd mon yy, поэтому то, что предложил Алексей, является правильным to_date (sales_date,’dd mon rr’) абсолютно правильно. Возможно, он пропустил одно условие request = ‘yes’.