如何在雪花 UDF 中调用 mysql 函数
How to call mysql function in snowflake UDF
我正在尝试在 snowflake.But 中编写 UDF 下面它不允许使用 sql 函数,例如 TO_DATE,DATE_ADD,dayofweek 。任何替代想法都会有所帮助。谢谢
CREATE OR REPLACE FUNCTION getShippingDate(deliveryDate varchar,deliveryCountryCode varchar, holidayList varchar,deliveryDays varchar)
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS $$
deliveryPeriod = 0
weekDay = 0
deliveryDate= TO_DATE(deliveryDate)
if(deliveryCountryCode != 'IN') {
deliveryPeriod = 2
}
else {
deliveryPeriod = deliveryDays + 1
}
if(deliveryPeriod <= 0) {
deliveryPeriod = 1
}
/* substract delivery period from delivery date */
deliveryDate = DATEADD(Day ,-deliveryPeriod, to_date(deliveryDate))
weekDay = dayofweek(deliveryDate)
/* if shipping date falls on sunday then substract 2 days */
if (weekDay == 0) {
deliveryDate = DATEADD(Day ,-2, to_date(deliveryDate))
}
/* if shipping date falls on saturday then substract 1 days */
if(weekDay == 6){
deliveryDate = DATEADD(Day ,-1, to_date(deliveryDate))
}
/* check if shipping date falls on holiday then substract 1 */
if(charindex(deliveryDate , holidayList) > 0) {
deliveryDate = DATEADD(Day ,-1, to_date(deliveryDate))
}
return deliveryDate
$$```
您可能需要像下面这样尝试:
创建或替换过程dbo.usp_test()
returns VARCHAR
语言 javascript
作为调用者执行
作为
$$
snowflake.createStatement( {sqlText: "SET dt = DATEADD(MONTH, 1,CURRENT_TIMESTAMP)"} ).execute();
return 'success';
$$
;
-- 调用 ds_work.ddd.usp_test()
将您的函数实现为标量 SQL UDF 可以解决这种情况下的问题。或者您可以实现自己的 javascript 日期数学运算。 For example。好消息是您可以从 SQL UDF 调用 JS UDF。
在 JavaScript 中创建日期函数相对容易。看下面的例子。
请记住:
- 请使用
DATE
SQL 数据类型作为输入和输出
- 参数必须是 "Quoted" 如果你想在 MixedCase
中引用它们
- 使用分号
;
终止每个语句
CREATE OR REPLACE FUNCTION getShippingDate("deliveryDate" DATE, "offset" FLOAT)
RETURNS DATE
LANGUAGE JAVASCRIPT
AS $$
function day_add(dt, days) {
return new Date(dt.getFullYear(), dt.getMonth(), dt.getDate() + offset);
}
return day_add(deliveryDate, offset);
$$;
SELECT getShippingDate(CURRENT_DATE, -2);
new Date()
当您在一个月中的天数之外进行加减时,会产生一些神奇效果。
我正在尝试在 snowflake.But 中编写 UDF 下面它不允许使用 sql 函数,例如 TO_DATE,DATE_ADD,dayofweek 。任何替代想法都会有所帮助。谢谢
CREATE OR REPLACE FUNCTION getShippingDate(deliveryDate varchar,deliveryCountryCode varchar, holidayList varchar,deliveryDays varchar)
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS $$
deliveryPeriod = 0
weekDay = 0
deliveryDate= TO_DATE(deliveryDate)
if(deliveryCountryCode != 'IN') {
deliveryPeriod = 2
}
else {
deliveryPeriod = deliveryDays + 1
}
if(deliveryPeriod <= 0) {
deliveryPeriod = 1
}
/* substract delivery period from delivery date */
deliveryDate = DATEADD(Day ,-deliveryPeriod, to_date(deliveryDate))
weekDay = dayofweek(deliveryDate)
/* if shipping date falls on sunday then substract 2 days */
if (weekDay == 0) {
deliveryDate = DATEADD(Day ,-2, to_date(deliveryDate))
}
/* if shipping date falls on saturday then substract 1 days */
if(weekDay == 6){
deliveryDate = DATEADD(Day ,-1, to_date(deliveryDate))
}
/* check if shipping date falls on holiday then substract 1 */
if(charindex(deliveryDate , holidayList) > 0) {
deliveryDate = DATEADD(Day ,-1, to_date(deliveryDate))
}
return deliveryDate
$$```
您可能需要像下面这样尝试:
创建或替换过程dbo.usp_test()
returns VARCHAR
语言 javascript
作为调用者执行
作为
$$
snowflake.createStatement( {sqlText: "SET dt = DATEADD(MONTH, 1,CURRENT_TIMESTAMP)"} ).execute();
return 'success';
$$
;
-- 调用 ds_work.ddd.usp_test()
将您的函数实现为标量 SQL UDF 可以解决这种情况下的问题。或者您可以实现自己的 javascript 日期数学运算。 For example。好消息是您可以从 SQL UDF 调用 JS UDF。
在 JavaScript 中创建日期函数相对容易。看下面的例子。
请记住:
- 请使用
DATE
SQL 数据类型作为输入和输出 - 参数必须是 "Quoted" 如果你想在 MixedCase 中引用它们
- 使用分号
;
终止每个语句
CREATE OR REPLACE FUNCTION getShippingDate("deliveryDate" DATE, "offset" FLOAT)
RETURNS DATE
LANGUAGE JAVASCRIPT
AS $$
function day_add(dt, days) {
return new Date(dt.getFullYear(), dt.getMonth(), dt.getDate() + offset);
}
return day_add(deliveryDate, offset);
$$;
SELECT getShippingDate(CURRENT_DATE, -2);
new Date()
当您在一个月中的天数之外进行加减时,会产生一些神奇效果。