案例和条件

时间:2016-09-15 20:06:29

标签: sql oracle

以下是我的sql代码。我想要所有带有描述的ID,这些ID会在8月25日到8月31日期间创建时间或更新时间。

目前,如果id在8月25日到8月31日之间创建时间,但更新时间是在9月,则sql将返回更新时间的记录。

理想情况下,它应该只返回在8月25日到8月31日之间创建或更新时间的记录。为什么我的情况忽略了更新时间的条件?

select t1.id, t1.desc,
Case
WHEN t1.create_time IS NOT NULL
THEN t1.create_time
WHEN t2.update_time IS NOT NULL
THEN t2.update_time
END AS "TimeStamp"
from t1, t2
where t1.id=t2.id(+)
AND ( t1.create_time BETWEEN TO_DATE ('25-AUG-2016 00:00:00',
                                   'dd-mon-yyyy HH24:Mi:SS')
                   AND TO_DATE ('31-AUG-2016 23:59:59',
                                'dd-mon-yyyy HH24:Mi:SS')
       OR (  t2.update_time
                   BETWEEN TO_DATE ('25-AUG-2016 00:00:00',
                                    'dd-mon-yyyy HH24:Mi:SS')
                   AND TO_DATE ('31-AUG-2016 23:59:59',
                                'dd-mon-yyyy HH24:Mi:SS')
                )
            )

2 个答案:

答案 0 :(得分:0)

试试这个:

SELECT t1.id, t1.desc,
t1.create_time  'TimeStamp'
from t1 
where
trunc(t1.create_time) BETWEEN TO_DATE ('25-AUG-2016','DD-MON-YYYY')
                   AND TO_DATE ('31-AUG-2016','DD-MON-YYYY')
union all
SELECT t1.id, t1.desc,
t1.update_time 'TimeStamp'
from t1 
where
(  trunc(t1.update_time)
                   BETWEEN TO_DATE ('25-AUG-2016','DD-MON-YYYY')
                   AND TO_DATE ('31-AUG-2016','DD-MON-YYYY')
                )

答案 1 :(得分:0)

create_time的{​​{1}}和update_time的查询条件中OR。当我们按OR合并两个条件时,如果其中一个条件为TRUE,那么结果也将是TRUE。因此,在您的查询中,如果create_time属于该范围内,那么不是metter update_time属于该范围内。

您可以在加入表之前使用子查询来过滤表

select t1_1.id, t1_1.desc,
CASE
WHEN t1_1.create_time IS NOT NULL
THEN t1_1.create_time
WHEN t2_1.update_time IS NOT NULL
THEN t2_1.update_time
END AS "TimeStamp"
from (select * from t1 
       where t1.create_time BETWEEN TO_DATE ('25-AUG-2016 00:00:00',
                                             'dd-mon-yyyy HH24:Mi:SS')
                                AND TO_DATE ('31-AUG-2016 23:59:59',
                                             'dd-mon-yyyy HH24:Mi:SS')) t1_1, 
      (select * from t2 
         where t2.update_time BETWEEN TO_DATE ('25-AUG-2016 00:00:00',
                                             'dd-mon-yyyy HH24:Mi:SS')
                                  AND TO_DATE ('31-AUG-2016 23:59:59',
                                             'dd-mon-yyyy HH24:Mi:SS')) t2_1
where t1_1.id_=t2_1.id_(+)