Netezza TO_CHAR 函数未正确评估?
Netezza TO_CHAR Function not evaluating appropriately?
我遇到一个查询问题,如果 运行 具有硬编码日期,则会将正确的行数插入 table (170K+)。问题是,当我尝试自动化它时,通过用日期函数替换硬编码日期,查询将只插入一行到新截断的 table.
示例硬编码日期:“20150401”
同一日期的示例,使用日期函数:
TO_CHAR(last_day(add_months(now(), -3))+1, 'YYYYMMDD')
以上TO_CHAR函数returns想要的结果,当运行分开。
这是导致插入单行的查询的清理版本:
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
);
我已经做了很多测试和研究,但我还没有找到可能的原因来解释为什么返回的记录数量会有如此大的不同。
谢谢,
贾斯汀
我认为这是因为您在 last_day
函数生成的字符串中添加了 1。检查你的括号:
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
我遇到一个查询问题,如果 运行 具有硬编码日期,则会将正确的行数插入 table (170K+)。问题是,当我尝试自动化它时,通过用日期函数替换硬编码日期,查询将只插入一行到新截断的 table.
示例硬编码日期:“20150401”
同一日期的示例,使用日期函数:
TO_CHAR(last_day(add_months(now(), -3))+1, 'YYYYMMDD')
以上TO_CHAR函数returns想要的结果,当运行分开。
这是导致插入单行的查询的清理版本:
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
);
我已经做了很多测试和研究,但我还没有找到可能的原因来解释为什么返回的记录数量会有如此大的不同。
谢谢,
贾斯汀
我认为这是因为您在 last_day
函数生成的字符串中添加了 1。检查你的括号:
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