【问题标题】:Oracle decode function not working for dateOracle 解码功能不适用于日期
【发布时间】:2015-01-15 06:00:04
【问题描述】:

查询没有给出正确的结果。我给出的提交日期在 2014 年 12 月 14 日到 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; 

【问题讨论】:

  • 将明确的DATE 格式添加到您的字符串中。使用TO_DATE('01-JAN-01' ,'DD-MON-RR')。因为 Oracle 的隐式格式对你来说是错误的。
  • 或使用 ANSI DATE 文字 date '2014-12-01'date '2001-01-01'(比正确的 to_date() 调用更少输入)。永远不要依赖隐式数据类型转换——尤其是在使用本地化月份名称时。
  • 如果有错误请纠正我,但你不能DECODENULL的值,因为NULL是一个固定值。
  • 我认为您需要此代码,但您需要查看日期 A 和日期 B 之间的第二个日期,但两者是相同的:AND Pp.code = '1' AND submit_date BETWEEN解码(提交日期,NULL,to_date('01-Dec-14','dd-MON-yy'),submit_date)和解码(submit_date,NULL,to_date('30-Dec-14','dd-MON-yy '),submit_date) AND approval_date BETWEEN Decode(p_approved_from, NULL, to_date('01-JAN-01','dd-MON-yy'),p_approved_from) AND Decode(p_approved_to,NULL,to_date('01-JAN-01) ','dd-MON-yy'),p_approved_to) AND p_status= 1
  • '01-jan-01' 和 p_approved_to 可能是不同的数据类型(因为我假设 p_approved_to 是 DATE 类型)。因此,在最好的情况下,他正在进行隐式转换,但如果您可以进行显式转换,则不应使用隐式转换。如果你在命令行使用隐式,很好。但不在代码中。

标签: sql oracle decode


【解决方案1】:

除了关于始终使用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,则该函数返回“非国内”。

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

在你的情况下,你总是检查固定值'01-Dec-14',因为这不是null,否则返回'01-Dec-14'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 2015-11-27
    相关资源
    最近更新 更多