javascript - 带有 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 年之间的几天除外,
select JDC(1942,02,10);
返回 1942-02-11 这是不正确的select JDC(1948,12,31);
返回 1949-01-01 这是不正确的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 时区运行,因此认为时区方面的转换应该回到前一天,但令人惊讶的是它会以其他方式运行。
解决方案
作为一种解决方法,您可以使用本机功能:
DATE_FROM_PARTS( <year>, <month>, <day> )
从代表年、月和月日的各个数字组件创建日期。
SELECT DATE_FROM_PARTS(1942,2,10)
推荐阅读
- java - 如何向 Android 线程发出信号以执行方法?
- java - 特价计算器
- java - 为什么我不能将抽象方法实现为私有方法
- openmp - FFTW3 - 就地并行化一维复数 fft 很慢
- python - 重新运行我的代码使 spyder 报告错误
- javascript - AngularJS:如何显示数组以及是否选择了要显示的任何值?
- javascript - 在 TypeScript 回调函数中使用预期条件作为参数的量角器
- swift - 使用分叉的 swift 包作为 Vapor 项目的依赖项
- mysql - Woocommerce 报告显示每种产品按日期销售的库存
- python - 使用 Python 将多行 Excel 数据转换为列和行