雪花任务导致查询中的时区错误

Posted

技术标签:

【中文标题】雪花任务导致查询中的时区错误【英文标题】: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() 调用中收到错误消息,因此包含生成错误的语句会很有用。 能否提供存储过程的代码? 【参考方案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 并且工作了吗?我遇到了同样的问题,我想在设置它时,所有具有不同格式时间的数据都将被忽略或引发错误。

以上是关于雪花任务导致查询中的时区错误的主要内容,如果未能解决你的问题,请参考以下文章

雪花任务正在执行,但在查询历史记录中找不到它们

由于数据中的“雪花问题”导致部分加载

在上次数据加载查询中出现验证错误时出错

替换雪花中的子查询

使用错误处理将整数转换为雪花中的日期

雪花仓库:MAX WH 尺寸可以封顶吗?