2015-06-10 118 views
0

我遇到一个查询问题,如果使用硬编码日期运行,会将正确数量的行插入表(170K +)中。问题是,当我尝试自动化时,通过用日期函数替换硬编码的日期,查询将只将一行插入到新截断的表中。Netezza TO_CHAR函数没有正确评估?

实施例硬编码日期:“20150401”

样品同日的,使用日期功能:

TO_CHAR(last_day(add_months(now(), -3))+1, 'YYYYMMDD') 

上面TO_CHAR函数返回所需的结果,当分开运行。

这里是被插入,结果在一个单行查询的清理后的版本:

INSERT INTO SCHEMA.INSERT_TABLE(

SELECT TO_CHAR(now(), 'YYYYMM') TRAN_MONTH, 

    SUM(CASE WHEN B.DATE = TO_CHAR(last_day(add_months(now(), -3))+1, 'YYYYMMDD') 
     THEN 'Do stuff' 
     END) AS Stuff1, 
    SUM(CASE WHEN B.DATE = TO_CHAR(last_day(add_months(now(), -3))+1, 'YYYYMMDD') 
     THEN 'Do other stuff' 
     END) AS Stuff2, 
    SUM(CASE WHEN B.DATE = TO_CHAR(last_day(add_months(now(), -3))+1, 'YYYYMMDD') 
     THEN 'Do really weird stuff' 
     END) AS Stuff3, 
    SUM(CASE WHEN B.DATE = TO_CHAR(last_day(add_months(now(), -3))+1, 'YYYYMMDD') 
     THEN 'Do really really weird stuff' 
     END) AS Stuff4, 
    SUM(CASE WHEN A.CODE= 1 
     THEN 'Do ... ' 
     END) AS Stuff5, 

FROM 

(SELECT Col1, Col2... FROM Table_A) A, 
(SELECT Col1, Col2... FROM Table_B) B, 
(SELECT Col1, Col2... FROM Table_C) C, 
(SELECT Col1, Col2... FROM Table_D) D, 
(SELECT Col1, Col2... FROM Table_E) E, 

WHERE 'Conditions for A, B, C, D, and E are met' 
    AND B.DATE = TO_CHAR(last_day(add_months(now(), -3))+1,'YYYYMMDD') 
GROUP BY All of the things 
ORDER BY Something 
); 

我已经做了相当多的测试和研究,但我还没有找到一个可能的原因是为什么返回的记录数量会非常大。

谢谢

贾斯汀

+0

这里有点难以从伪代码中知道发生了什么,没有任何数据。也很难从错误/不正确的语法中分辨有意识的伪代码。如果您将每个TO_CHAR(last_day(add_months(now(),-3))+ 1,'YYYYMMDD')的实例替换为'20150401',您是否说它可行? WHERE子句显示没有格式字符串的TO_CHAR函数,所以它本身将失败。 – ScottMcG

+0

道歉,我必须切断WHERE子句中条件语句的最后部分。无论哪种方式,我们都知道问题不在日期函数中,而是在表中。不知何故,旗帜被改变导致结果集严重受限。 @ScottMcG感谢您的回复,并纠正了我糟糕的剪贴工作。 –

回答

0

我想这是因为你增加了1到您的last_day功能所产生的字符串。检查你的括号:

WHERE 'Conditions for A, B, C, D, and E are met' 
    AND B.DATE = TO_CHAR(last_day(add_months(now(), -3)+1) 

如果它不是(或者你真的要1添加到字符串),然后我要去无路可退,并假设B.DATE是列类型date。如果是这样,它没有正确比较的原因是因为你依靠隐式转换。更改日期过滤器以明确转换双方。

WHERE 'Conditions for A, B, C, D, and E are met' 
    AND B.DATE::date = (last_day(add_months(now(), -3)+1)::date