Sql 对整个查询进行一次日期检查

Sql 对整个查询进行一次日期检查,sql,oracle,Sql,Oracle,我有以下疑问: select fp.id, fr.id, sum(case when to_date(fp.offered_date) BETWEEN TO_DATE( :ad_startdate, 'YYYY-MM-DD') AND TO_DATE(:ad_enddate, 'YYYY-MM-DD') and fp.result <> 'E' then 1 else

我有以下疑问:

select 
    fp.id, 
    fr.id,
    sum(case 
        when to_date(fp.offered_date) BETWEEN TO_DATE( :ad_startdate, 'YYYY-MM-DD') 
             AND TO_DATE(:ad_enddate, 'YYYY-MM-DD') and fp.result <> 'E'
             then 1 
        else 0 
        end) total,
    sum(case when fp.result = 'G' 
        and  to_date(fp.offered_date) >=  :ad_startdate
        and  to_date(fp.offered_date) <= :ad_enddate then 1 else 0 end) colorgreen,
    sum(case when fp.resultat = 'R' 
        and  to_date(fp.offered_date) >=  :ad_startdate
        and  to_date(fp.offered_date) <= :ad_enddate then 1 else 0 end) colorred
FROM 
    fruit_properties fp, fruit fr
WHERE 
    fp.id = fr.id
GROUP BY 
    fp.id, fr.id
选择
fp.id,
联邦调查局局长,
总数(例)
何时截止日期(fp.提供日期)介于截止日期(:ad_startdate,'YYYY-MM-DD')之间
截止日期(:ad_enddate,'YYYY-MM-DD')和fp.result'E'
那么1
其他0
完)总计,,
总和(fp.result='G'时的情况)
截止日期(fp.提供日期)>=:ad\U开始日期
截止日期(fp.提供日期)=:ad_开始日期

和to_date(fp.offered_date)您可以在where子句中输入日期检查:

select 
    fp.id, 
    fr.id,
    sum(case when  and fp.result <> 'E' then 1 else 0 end) total,
    sum(case when fp.result = 'G' then 1 else 0 end) colorgreen,
    sum(case when fp.resultat = 'R' then 1 else 0 end) colorred
FROM 
    fruit_properties fp, fruit fr
WHERE 
    fp.id = fr.id
    AND to_date(fp.offered_date) >=  :ad_startdate
    AND to_date(fp.offered_date) <= :ad_enddate
GROUP BY 
    fp.id, fr.id
选择
fp.id,
联邦调查局局长,
总和(当和fp.result“E”时,则为1,否则为0结束)总计,
sum(当fp.result='G'然后1 else 0 end时的情况)颜色为绿色,
sum(当fp.resultat='R'然后1 else 0 end时的情况)为红色
从…起
水果特性fp,水果fr
哪里
fp.id=fr.id
截止日期(fp.提供日期)>=:ad\U开始日期

和to_date(fp.offered_date)您可以这样简化。但是请检查您的SQL。您混合了to_date和CHAR数据类型。这只会导致灾难

例如你有:

when to_date(fp.offered_date) BETWEEN TO_DATE( :ad_startdate, 'YYYY-MM-DD') 
             AND TO_DATE(:ad_enddate, 'YYYY-MM-DD')
vs

在一种情况下,您需要为ad startdate(开始日期)而不是另一个日期(那么它是否已经是一个日期?)。您还需要为列添加日期,但最重要的是没有格式掩码。该列真的是一个VARCHAR数据类型吗?如果是这样,您真的不应该将日期存储为日期以外的任何内容

无论如何,假设列是日期数据类型,绑定是日期类型

select fruit_prop_Id,fruit_id, 
       sum(case when result != 'E' then within_offer else 0 end) total,
       sum(case when result = 'R' then within_offer else 0 end) colorred,
       sum(case when result = 'G' then within_offer else 0 end) colorgreen
 from (select fp.id fruit_id, 
                fr.id fruit_prop_Id,
                fp.result,
                case 
                   when fp.offered_date >= :ad_startdate
                    and fp.offered_date <= :ad_enddate then 1 else 0 end within_offer
         from fruit_properties fp, fruit fr
        where fp.id = fr.id)
        group by fruit_id, fruit_prop_Id
选择水果属性Id、水果Id、,
总和(当结果为“E”时,则在“0”范围内)总计,
sum(当结果为'R'时,则在0端内)颜色为红色,
求和(当结果为“G”时,则在0范围内)颜色绿色
从(选择fp.id和fru id,
fr.id水果和道具,
fp.result,
案例
当fp.U日期>=:ad\U开始日期

fp.u date这将在您筛选行时更改他的答案。尽管您的答案帮助了我,但我无法应用它,因为我无法筛选日期行,这将给我带来糟糕的结果是的,您是对的,我对sql非常陌生,这是一个草率的查询。实际上,该查询已经是一个嵌套的select,我希望避免再次出现呃,一个。什么能提供最好的性能,我的解决方案有2个选择,或者你的解决方案有更好的日期检查,但是有3个选择?虽然使用此特定SQL的客户端确保它是一个日期输入:)不要害怕嵌套选择。它们(不一定)意味着性能更差(记住,这只是一个视图).oracle可以并且将在内部重写查询。您将发现嵌套的select与原始查询的性能一样。
select fruit_prop_Id,fruit_id, 
       sum(case when result != 'E' then within_offer else 0 end) total,
       sum(case when result = 'R' then within_offer else 0 end) colorred,
       sum(case when result = 'G' then within_offer else 0 end) colorgreen
 from (select fp.id fruit_id, 
                fr.id fruit_prop_Id,
                fp.result,
                case 
                   when fp.offered_date >= :ad_startdate
                    and fp.offered_date <= :ad_enddate then 1 else 0 end within_offer
         from fruit_properties fp, fruit fr
        where fp.id = fr.id)
        group by fruit_id, fruit_prop_Id