【发布时间】: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 类型)。因此,在最好的情况下,他正在进行隐式转换,但如果您可以进行显式转换,则不应使用隐式转换。如果你在命令行使用隐式,很好。但不在代码中。