转换日期时如何处理异常
How do I handle exception while converting date
我有一个Sales
table和一个Period
table。
销售额table
+--------------+-------------+
| Country_Code | Period_Code |
+--------------+-------------+
| CH | MAI_18 |
| CH | JUN_18 |
| NO | 2020-01-21 |
| NO | 2020-01-21 |
+--------------+-------------+
期间table
+--------------+-------------+
| Country_Code | Period_Code |
+--------------+-------------+
| NO | 200121 |
| NO | 200122 |
+--------------+-------------+
我在加入这 2 个 table 时遇到以下错误。
下面是我用的sql。根据我的理解,由于我在第 2 行中将国家/地区过滤器指定为 NO
,因此它应该首先执行第 2 行,然后仅在 NO
国家/地区上进行连接。但在内部,它也在考虑 CH
国家/地区,这导致以下 sql 失败。
SELECT DISTINCT SAL.COUNTRY_CODE,PER.PERIOD_CODE
FROM (SELECT * FROM MYSCHEMA.SALES WHERE COUNTRY_CODE in('NO')) SAL
JOIN MYSCHEMA.PERIOD PER
ON SAL.COUNTRY_CODE=PER.COUNTRY_CODE
AND TO_CHAR(TO_DATE(SAL.PERIOD_CODE,'YYYY-MM-DD'),'YYMMDD') = PER.PERIOD_CODE
ORDER BY 1
我也使用了 CTE
,它的行为方式相同。可能有一些解决方案。如果有人可以提供帮助使 sql 运行 没有任何错误,我将不胜感激。
Snowflake 明确地比 SQL 规范状态更早地进行转换,因此 text/variant 数据的转换发生在您预期之前。我在 2016 年向他们提出了这个问题,而有时他们 fix/alter 一些行为,它也可以改变并因此开始崩溃。
如果列的内容并非全部有效,这是您的情况,您应该使用 TRY_
版本的命令,因此此处使用 TRY_TO_DATE 以避免错误。
因此你应该会发现这个有效:
SELECT DISTINCT SAL.COUNTRY_CODE,PER.PERIOD_CODE
FROM (SELECT * FROM MYSCHEMA.SALES WHERE COUNTRY_CODE in('NO')) SAL
JOIN MYSCHEMA.PERIOD PER
ON SAL.COUNTRY_CODE=PER.COUNTRY_CODE
AND TO_CHAR(TRY_TO_DATE(SAL.PERIOD_CODE,'YYYY-MM-DD'),'YYMMDD') = PER.PERIOD_CODE
ORDER BY 1
我倾向于将日期转换移动到子 select(或 CTE,如果您使用其中之一)以使连接更简单,尽管 Snowflake 会为您完成此操作,因此我会像这样写:
SELECT DISTINCT sal.country_code,
per.period_code
FROM (
SELECT country_code,
TO_CHAR(TRY_TO_DATE(SAL.PERIOD_CODE,'YYYY-MM-DD'),'YYMMDD') AS join_code
FROM myschema.sales
WHERE country_code in ('NO')
) sal
JOIN myschema.period per
ON sal.country_code = per.country_code
AND sal.join_code = per.period_code
ORDER BY 1
但鉴于您的示例 table,我假设它不包含所有列,只是重现问题所需的,应该可以通过以下方式触发:
SELECT country_code,
TO_CHAR(TRY_TO_DATE(SAL.PERIOD_CODE,'YYYY-MM-DD'),'YYMMDD') AS join_code
FROM myschema.sales
WHERE country_code in ('NO')
我有一个Sales
table和一个Period
table。
销售额table
+--------------+-------------+
| Country_Code | Period_Code |
+--------------+-------------+
| CH | MAI_18 |
| CH | JUN_18 |
| NO | 2020-01-21 |
| NO | 2020-01-21 |
+--------------+-------------+
期间table
+--------------+-------------+
| Country_Code | Period_Code |
+--------------+-------------+
| NO | 200121 |
| NO | 200122 |
+--------------+-------------+
我在加入这 2 个 table 时遇到以下错误。
下面是我用的sql。根据我的理解,由于我在第 2 行中将国家/地区过滤器指定为 NO
,因此它应该首先执行第 2 行,然后仅在 NO
国家/地区上进行连接。但在内部,它也在考虑 CH
国家/地区,这导致以下 sql 失败。
SELECT DISTINCT SAL.COUNTRY_CODE,PER.PERIOD_CODE
FROM (SELECT * FROM MYSCHEMA.SALES WHERE COUNTRY_CODE in('NO')) SAL
JOIN MYSCHEMA.PERIOD PER
ON SAL.COUNTRY_CODE=PER.COUNTRY_CODE
AND TO_CHAR(TO_DATE(SAL.PERIOD_CODE,'YYYY-MM-DD'),'YYMMDD') = PER.PERIOD_CODE
ORDER BY 1
我也使用了 CTE
,它的行为方式相同。可能有一些解决方案。如果有人可以提供帮助使 sql 运行 没有任何错误,我将不胜感激。
Snowflake 明确地比 SQL 规范状态更早地进行转换,因此 text/variant 数据的转换发生在您预期之前。我在 2016 年向他们提出了这个问题,而有时他们 fix/alter 一些行为,它也可以改变并因此开始崩溃。
如果列的内容并非全部有效,这是您的情况,您应该使用 TRY_
版本的命令,因此此处使用 TRY_TO_DATE 以避免错误。
因此你应该会发现这个有效:
SELECT DISTINCT SAL.COUNTRY_CODE,PER.PERIOD_CODE
FROM (SELECT * FROM MYSCHEMA.SALES WHERE COUNTRY_CODE in('NO')) SAL
JOIN MYSCHEMA.PERIOD PER
ON SAL.COUNTRY_CODE=PER.COUNTRY_CODE
AND TO_CHAR(TRY_TO_DATE(SAL.PERIOD_CODE,'YYYY-MM-DD'),'YYMMDD') = PER.PERIOD_CODE
ORDER BY 1
我倾向于将日期转换移动到子 select(或 CTE,如果您使用其中之一)以使连接更简单,尽管 Snowflake 会为您完成此操作,因此我会像这样写:
SELECT DISTINCT sal.country_code,
per.period_code
FROM (
SELECT country_code,
TO_CHAR(TRY_TO_DATE(SAL.PERIOD_CODE,'YYYY-MM-DD'),'YYMMDD') AS join_code
FROM myschema.sales
WHERE country_code in ('NO')
) sal
JOIN myschema.period per
ON sal.country_code = per.country_code
AND sal.join_code = per.period_code
ORDER BY 1
但鉴于您的示例 table,我假设它不包含所有列,只是重现问题所需的,应该可以通过以下方式触发:
SELECT country_code,
TO_CHAR(TRY_TO_DATE(SAL.PERIOD_CODE,'YYYY-MM-DD'),'YYMMDD') AS join_code
FROM myschema.sales
WHERE country_code in ('NO')