【问题标题】:Snowflake Tasks causing error in timezone in queries雪花任务导致查询中的时区错误
【发布时间】:2020-01-06 23:13:34
【问题描述】:

我正在使用to_timeatamp_ntz("column value") 以及其他列的存储过程中运行一个简单的插入查询。 当我使用雪花 UI 运行它并使用我的帐户登录时,这可以正常工作。 当我使用我的 Visual Studio 实例中的 python 脚本调用它时,这很好用。 当计划任务调用相同的存储过程时,它会失败。 我在想它是否与用户的“系统”时区与我的时区有关。

存储过程 LOAD_Data() 中的执行错误:无法转换变量 将“2019-11-27T13:42:03.221Z”值设置为 TIMESTAMP_NTZ At Statement.execute,第 24 行位置 57

我尝试在任务和存储过程中提供时区作为会话参数,但似乎没有解决问题。有什么想法吗?

【问题讨论】:

  • 我用“INSERT INTO TEST_TIMESTAMP(T1) SELECT TO_TIMESTAMP_NTZ('2019-11-27T13:42:03.221Z');”做了一个任务其中列是 NTZ_TIMESTAMP(9) 并且它运行成功。我是否缺少要复制的东西?让我知道您是否可以设置一个类似的非常简单的任务,看看它是否有效。我想知道它是特定于参数还是数据。
  • 由于您从 Statement.execute() 调用中收到错误消息,因此包含生成错误的语句会很有用。
  • 能否提供存储过程的代码?

标签: stored-procedures task snowflake-cloud-data-platform


【解决方案1】:

我猜测(因为您没有包含导致错误的 SQL 语句)您在创建 Statement 对象时尝试绑定 Date 对象。那是行不通的。

您可以绑定的唯一参数是数字、字符串、null 和特殊的 SfDate 对象,您只能从结果集中获得(据我所知)。大部分其他参数必须在绑定前使用mydate.toJSON()JSON.stringify(myobj)等转换成string,例如:

var stmt = snowflake.createStatement(
   { sqlText: `SELECT :1::TIMESTAMP_LTZ NOW`, binds: [(new Date).toJSON()] }
);

Date 对象错误可能会产生误导,因为导致错误的 Date 对象可以转换并显示为错误消息中的字符串。

【讨论】:

    【解决方案2】:

    我发现了问题: 我的任务正在使用类似于这样的复制粘贴效果:

    CREATE TASK TASK_LOAD_an_sp
      WAREHOUSE = COMPUTE_WH
      TIMEZONE = 'US/Eastern'  
    SCHEDULE = 'USING CRON  0/30 * * * * America/New_York'
      TIMESTAMP_INPUT_FORMAT = 'YYYY-MM-DD HH24'
    AS
        Call LOAD_an_sp();
    

    时间戳输入格式导致了这种情况。

    【讨论】:

    • 所以你从任务 ddl 中删除了 TIMESTAMP_INPUT_FORMAT 并且工作了吗?我遇到了同样的问题,我想在设置它时,所有具有不同格式时间的数据都将被忽略或引发错误。
    猜你喜欢
    • 2022-11-12
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 2022-07-10
    • 2021-12-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多