Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 转换日期时如何处理异常_Sql_Join_Snowflake Cloud Data Platform_Date Conversion_Inner Query - Fatal编程技术网

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