为啥这个函数总是返回0
Posted
技术标签:
【中文标题】为啥这个函数总是返回0【英文标题】:Why does this function always return 0为什么这个函数总是返回0 【发布时间】:2014-08-05 07:57:55 【问题描述】:不知道为什么这个函数总是返回0
CREATE OR REPLACE FUNCTION QTYDEPOT(
p_org_id IN NUMBER,
p_product_id IN NUMBER,
p_datefrom IN DATE,
p_dateto IN DATE)
RETURN NUMBER
AS
qty NUMBER;
BEGIN
SELECT COALESCE(SUM(C_InvoiceLine.qtyinvoiced), 0)
INTO qty
FROM C_InvoiceLine
INNER JOIN C_invoice
ON (c_invoiceline.C_INVOICE_ID = c_invoice.C_INVOICE_ID)
INNER JOIN C_BPartner
ON (c_invoice.C_BPARTNER_ID = c_bpartner.C_BPARTNER_ID)
WHERE C_BPartner.ISSALESREP = 'N'
AND C_BPartner.ISEMPLOYEE = 'N'
AND c_bpartner.ISCUSTOMER = 'Y'
AND c_invoiceline.AD_org_id = p_org_id
AND c_invoiceline.m_product_id= p_product_id
AND c_invoice.DateInvoiced BETWEEN p_datefrom AND p_dateto;
RETURN qty ;
END;
P.S : 如果我删除关闭 where
的日期部分
c_invoice.DateInvoiced BETWEEN p_datefrom AND p_dateto;
函数返回实际值。
我这样称呼它
SELECT
..
QTYDEPOT( 1000000, p.m_product_id,'7/7/2014','24/7/2014') as qtyDepot
【问题讨论】:
那么对于您传入的值和日期,您在表中是否有任何匹配的记录?当您传递字符串并依赖隐式转换时,我通常会怀疑日期格式问题,但在这种情况下会出错(因为没有 24 个月)。 如果在函数外手动运行相同的查询会发生什么? 我猜你使用的是英国日期格式。为确保正确读取日期,我建议使用“24/Jul/2014”或 ISO 格式“2014-07-24”。 您需要先评估此查询 select * FROM C_InvoiceLine INNER JOIN C_invoice ON (c_invoiceline.C_INVOICE_ID = c_invoice.C_INVOICE_ID) INNER JOIN C_BPartner ON (c_invoice.C_BPARTNER_ID = c_bpartner.C_BPARTNER_ID) WHERE C_BPartner.ISSALESREP = 'N' AND C_BPartner.ISEMPLOYEE = 'N' AND c_bpartner.ISCUSTOMER = 'Y' AND c_invoiceline.AD_org_id = p_org_id AND c_invoiceline.m_product_id= p_product_id AND c_invoice.DateInvoiced BETWEEN p_datefrom AND p_dateto; RETURN qty ;你应该得到上述查询的记录..检查连接和 where 子句。 我在调用 date 时发现它必须是这样的 QTYDEPOT(1000000, p.m_product_id,'7/7/14','24/7/14') as qtyDepot跨度> 【参考方案1】:试试这个:
SELECT
..
QTYDEPOT( 1000000, p.m_product_id,to_date('7/7/2014','dd/mm/yyyy'),to_date('24/7/2014','dd/mm/yyyy')) as qtyDepot
您必须指定要传递给函数的日期格式,
希望这会有所帮助!
【讨论】:
【参考方案2】:您在处理 DATE 时遇到问题。我建议您尝试像这样调用您的函数:
SELECT
..
QTYDEPOT( 1000000, p.m_product_id,DATE('2014-07-07'),DATE('2014-07-24')) as qtyDepot
如您所见,Oracle 标准格式为'yyyy-mm-dd'
我不知道是否需要DATE(...)
,但我习惯这样操作DATE
:代码更清晰。
【讨论】:
我不认为DATE
可以如上图那样使用。也许目的是使用TO_DATE
函数,如:TO_DATE('2014-07-24', 'YYYY-MM-DD')
。以上是关于为啥这个函数总是返回0的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的碰撞测试总是返回“真”,为啥图像矩形的位置总是错误的 (0, 0)?