首页 > 解决方案 > 带有 JavaScript 的雪花 UDF 返回不正确的日期

问题描述

我遇到了一个问题,即我在 Snowflake 中使用 JavaScript 语言实现的用户定义函数 (UDF) 返回无效日期,它增加了一天。

为了演示问题,这里有一个简单的 UDF,它接受三个参数年、月、日并返回 Date 对象。

CREATE OR REPLACE FUNCTION JDC(YEAR FLOAT,MONTH FLOAT,DAY FLOAT)
RETURNS DATE
LANGUAGE JAVASCRIPT
AS
$$
   // In Java Script months start with 0 so -1
   return new Date(YEAR,MONTH-1,DAY)
$$
;

调用此过程会返回所有年份的正确值,但 1942 年到 1949 年之间的几天除外,

  1. select JDC(1942,02,10);返回 1942-02-11 这是不正确的
  2. select JDC(1948,12,31);返回 1949-01-01 这是不正确的
  3. select JDC(2020,02,10);返回 2020-02-10,正确值

如果您注意到 1、2,它将在 javascript 日期转换为雪花期间增加一天。我确认 JavaScript 能够通过将 UDF 返回类型更改为 VARCHAR 并将日期对象作为字符串返回来返回正确的值return new Date(YEAR,MONTH-1,DAY).toString(),所以在转换过程中会发生一些事情。

默认情况下,JavaScript 使用 UTC 时区,并且我当前的雪花实例设置为在 PST 时区运行,因此认为时区方面的转换应该回到前一天,但令人惊讶的是它会以其他方式运行。

标签: javascriptdateuser-defined-functionssnowflake-cloud-data-platform

解决方案


作为一种解决方法,您可以使用本机功能:

DATE_FROM_PARTS

DATE_FROM_PARTS( <year>, <month>, <day> )

从代表年、月和月日的各个数字组件创建日期。

SELECT DATE_FROM_PARTS(1942,2,10)

推荐阅读