在Oracle SQL中查找两个varchar日期之间的天数

在Oracle SQL中查找两个varchar日期之间的天数,oracle,Oracle,我是Oracle SQL的初学者,我想问两个问题 首先,我想找出两个事件之间的天数(所以当它们是“是”时)。这两个日期当前为varchars(!) 伪代码: 当请求为是且销售为是时,从请求日期中减去销售日期 数据如下所示: Id request request_date sales sales_date 1 yes 2 feb14 yes 3 feb 14 2 yes 3 feb 14 no

我是Oracle SQL的初学者,我想问两个问题

首先,我想找出两个事件之间的天数(所以当它们是“是”时)。这两个日期当前为varchars(!)

伪代码: 当请求为是且销售为是时,从请求日期中减去销售日期

数据如下所示:

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
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
)
理想情况下,我希望结果是:

Id  request request_date    sales   sales_date   days_between_request_sales
1    yes    2 feb14         yes       3 feb 14          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'
输出:

    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'
选择平均值(截止日期(销售日期,'dd-mm-yy')-截止日期(请求日期,'dd-mm-yy'))作为平均值
从…起
其中sales=‘是’
请求='是'

假设您有这样一张表:

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
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'
要计算这些结果天数的平均值,只需使用平均值:

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'

我不明白它是如何与前一个日期(销售日期,'dd-mm-yyyy')一起工作的,这是完全错误的,因为您的格式是dd-mon-yy,所以Aleksej建议的是正确的日期(销售日期,'dd-mon-rr'),这是绝对正确的。他可能错过了一个条件请求,即“是”

多谢各位!当我在我的数据集上尝试此操作时,我得到错误:“文本与格式字符串不匹配”。有可能我需要更改日期吗?我使用了您给定的数据并向您展示了一个演示。但是,从第一个记录开始,它可能会导致问题<代码>2014年2月2日。我想月份和年份之间应该有一个空格
12 feb 14
。试试看。另外,如果演示与您一起使用,请尝试。您的第二个问题不太清楚,因此我没有发布任何答案。为您想要的平均值添加一些示例再次感谢,它现在非常有效!对于平均数,我的意思是,我想将请求和销售之间的所有天数相加(因此,只有请求和销售都是肯定的),然后除以发生次数。这将导致一个数字。请注意,
TRUNC
不是必需的;此外,您使用的格式掩码不适合OP数据;例如,
to_date('2014年2月28日','dd-mm-yyyy')
给出了
28/02/0014
,我认为这不是OP想要表示的日期。日期的平均值是什么意思?在您的示例中,(即使不只是考虑带“是”的行),平均值应该是多少?谢谢您的问题。对于平均数,我的意思是,我想将请求和销售之间的所有天数相加(因此,只有请求和销售都是肯定的),然后除以发生次数。这将导致一个数字。如果仍然不清楚,请让我知道。你评论了其他人的帖子,指出OP没有寻找什么,但你真的看了OP问题吗。您的查询不会给出Op想要什么<代码>请求是“是”,销售是“是”,从请求日期中减去销售日期。…您的查询将永远不会产生Op想要的结果。因此,投反对票