繁体   English   中英

雪花 TO_DATE 或 DATE 未从存储过程返回预期输出

[英]Snowflake TO_DATE or DATE not returning expected output from Stored Procedure

我正在设置会话变量

SET MY_LOAD_DATE = '1999-01-01T10:10:10';

SELECT TO_DATE('1999-01-01T10:10:10.0') as d; // this command will return proper date output

1999-01-01

CREATE OR REPLACE PROCEDURE MY_ID_UPDATE(ARG STRING)
RETURNS STRING
LANGUAGE JAVASCRIPT
AS
    $$
        var result = snowflake.execute({sqlText: `SELECT TO_DATE('`+ ARG +`') as d`});
        result.next();
        return result.getColumnValue(1);
        return my_date;
    $$;
    
CALL MY_ID_UPDATE($MY_LOAD_DATE);

存储过程返回以下

1999 年 1 月 1 日星期五 00:00:00 GMT-0800(太平洋标准时间)

存储过程内部发生了什么,为什么我为同一个 SELECT TO_DATE语句得到不同的输出。

......答案......

我已将字符串日期转换为日期,然后使用 toLocaleDateString 方法仅从日期时间获取日期。

CREATE OR REPLACE PROCEDURE MY_ID_UPDATE(ARG STRING)
RETURNS STRING
LANGUAGE JAVASCRIPT
AS
    $$
        var result = snowflake.execute({sqlText: `SELECT TO_DATE(?) as d`, binds: [ARG]});
        result.next();
        var my_date = result.getColumnValue(1);
        var d = new Date(my_date);
        return d.toLocaleDateString();
    $$;

这将返回1/1/1999

“存储过程中发生了什么,为什么我为同一个 SELECT TO_DATE 语句得到不同的输出。”

JavaScript 数据类型

SQL 和 JavaScript UDF 提供相似但不同的数据类型,基于它们的原生数据类型支持。 Snowflake 和 JavaScript 中的对象使用以下映射进行传输。

...

所有时间戳和日期类型都转换为 JavaScript Date() 对象。 JavaScript 日期类型等效于 Snowflake SQL 中的 TIMESTAMP_LTZ(3)。

...

SQL DATE 转换为 JavaScript 日期,表示本地时区中当天的午夜。

转换如下:

  1. ARG: CREATE OR REPLACE PROCEDURE MY_ID_UPDATE(ARG STRING)作为字符串
  2. SQL: TO_DATE(...)作为日期
  3. JavaScript: result.getColumnValue(1); 日期()对象
  4. JavaScript 存储过程; RETURNS STRING日期()对象转换回串

旁注:连接字符串执行可能会导致 SQL 注入

var result = snowflake.execute({sqlText: `SELECT TO_DATE('`+ ARG +`') as d`});

更好的方法是提供参数化查询:

var result = snowflake.execute({sqlText: `SELECT TO_DATE(?) as d`
                                ,binds: [ARG]});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM