Oracle解码功能不适用于日期

时间:2015-01-15 06:00:04

标签: sql oracle decode

查询未给出正确的结果。我将在01年12月14日至12月30日期间提交提交日期,但会在11月份获得结果。

SELECT DISTINCT O.id,
                pg.name,
                pt.name,
                PP.company_name,
                PP.code,
                O.order_number,
                O.status,
                O.submit_date,
                O.approval_date
FROM   orders O,
       partnerprofile PP,
       partnertype pt,
       partnergroup pg
WHERE  PP.id = O.to_partner_id
       AND Pp.type_id (+) = 8
       AND o.ordering_ratio_flag = Decode('NO', 'YES', '1',
                                                'NO', '0')
       AND pp.group_id = pg.id
       AND Pp.type_id(+) = Pt.id
       AND Decode(NULL, NULL, '1',
                        Pp.code) = Decode(NULL, NULL, '1',
                                                NULL)
       AND submit_date BETWEEN Decode('01-Dec-14', NULL, ( '01-JAN-01' ),
                                                   '01-Dec-14') AND
                                   Decode('30-Dec-14', NULL, ( '01-JAN-01' ),
                                                       '30-Dec-14')
       AND approval_date BETWEEN Decode(p_approved_from, NULL, ( '01-JAN-01' ),
                                                         p_approved_from) AND
                                 Decode(
                                     p_approved_to, NULL, ( '01-JAN-01' ),
                                                    p_approved_to
                                                                              )
       AND Decode(p_status, NULL, '1',
                            O.status) = Decode(p_status, NULL, '1',
                                                         p_status)
ORDER  BY O.id; 

1 个答案:

答案 0 :(得分:0)

除了评论总是使用to_date / datefunctions,如果你确实有日期数据类型,你使用解码是没有意义的:

Decode('01-Dec-14', NULL, ( '01-JAN-01' ), '01-Dec-14') 
--this is always (!) '01-Dec-14'

解码“if then else”的工作原理如下:

SELECT product_id,
       DECODE (warehouse_id, 1, 'Southlake', 
                             2, 'San Francisco', 
                             3, 'New Jersey', 
                             4, 'Seattle',
                                'Non domestic') 
       "Location of inventory" FROM inventories
       WHERE product_id < 1775;

此示例解码值warehouse_id。如果warehouse_id为1,则函数返回'Southlake';如果warehouse_id为2,则返回'旧金山';等等。如果warehouse_id不是1,2,3或4,则函数返回'Non domestic'。

http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions040.htm

在您的情况下,您始终会检查固定值'01-Dec-14',因为这不是null返回的其他情况'01-Dec-14'