Sql 转换日期时如何处理异常
我有一个Sql 转换日期时如何处理异常,sql,join,snowflake-cloud-data-platform,date-conversion,inner-query,Sql,Join,Snowflake Cloud Data Platform,Date Conversion,Inner Query,我有一个Sales表和一个Period表 销售表 +--------------+-------------+ | Country_Code | Period_Code | +--------------+-------------+ | CH | MAI_18 | | CH | JUN_18 | | NO | 2020-01-21 | | NO | 2020-01-21 | +-------
Sales
表和一个Period
表
销售表
+--------------+-------------+
| Country_Code | Period_Code |
+--------------+-------------+
| CH | MAI_18 |
| CH | JUN_18 |
| NO | 2020-01-21 |
| NO | 2020-01-21 |
+--------------+-------------+
+--------------+-------------+
| Country_Code | Period_Code |
+--------------+-------------+
| NO | 200121 |
| NO | 200122 |
+--------------+-------------+
期间表
+--------------+-------------+
| Country_Code | Period_Code |
+--------------+-------------+
| CH | MAI_18 |
| CH | JUN_18 |
| NO | 2020-01-21 |
| NO | 2020-01-21 |
+--------------+-------------+
+--------------+-------------+
| Country_Code | Period_Code |
+--------------+-------------+
| NO | 200121 |
| NO | 200122 |
+--------------+-------------+
当我连接这两个表时,出现以下错误
下面是我使用的sql。根据我的理解,由于我在第2行中已将国家/地区筛选器指定为NO
,因此它应首先执行第2行,然后仅在NO
国家/地区执行联接。但在内部,它也在考虑导致以下sql失败的CH
国家/地区
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规范状态之前显式地进行转换,因此文本/变量数据的转换会在您预期的时间之前进行。我在2016年向他们提出了这个问题,而他们有时会修复/改变一些行为,它也会改变,从而开始破坏
如果列的内容并非全部有效,这是您的情况,您应该使用TRY\uu
版本的命令,因此这里使用以避免错误
因此,你应该发现这是可行的:
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
我倾向于将日期转换移动到子选择(或CTE,如果您使用其中一个)中,以使连接更简单,尽管雪花可以为您这样做,因此我将这样写:
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
但考虑到您的示例表(我假设该表不包含所有列),只需要重新生成问题,应该可以通过以下方式触发:
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')
Snowflake显式地在SQL规范状态之前进行转换,因此文本/变量数据的转换在您预期的时间之前进行。我在2016年向他们提出了这个问题,而他们有时会修复/改变一些行为,它也会改变,从而开始破坏 如果列的内容并非全部有效,这是您的情况,您应该使用
TRY\uu
版本的命令,因此这里使用以避免错误
因此,你应该发现这是可行的:
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
我倾向于将日期转换移动到子选择(或CTE,如果您使用其中一个)中,以使连接更简单,尽管雪花可以为您这样做,因此我将这样写:
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
但考虑到您的示例表(我假设该表不包含所有列),只需要重新生成问题,应该可以通过以下方式触发:
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')
如果您期望输出,并且可能是db FIDLE,则会更容易提供帮助。这里的问题不是期望输出。问题是sql正在抛出错误。我需要让这个sql在没有任何错误的情况下运行。sql不定义执行顺序,它可以按任何顺序计算条件和执行计算-只定义结果集。我不知道你SQL的可能性;在某些平台上,您可以使用
try_convert()
,在某些平台上,您应该使用某种类型的case
表达式来排除转换非法条目的可能性。如果您需要输出,可能需要db fiddle,则更容易提供帮助。这里不需要考虑预期输出。问题是sql正在抛出错误。我需要让这个sql在没有任何错误的情况下运行。sql不定义执行顺序,它可以按任何顺序计算条件和执行计算-只定义结果集。我不知道你SQL的可能性;在某些平台上,您可以使用try\u convert()
,在某些平台上,您应该使用某种case
表达式来排除转换非法条目的可能性。谢谢Simeon。工作得很有魅力+1@Simeon感谢Simeon。工作得很有魅力+1@Simeon Pilgrim