如何在雪花 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 中创建日期函数相对容易。看下面的例子。
请记住:

  1. 请使用 DATE SQL 数据类型作为输入和输出
  2. 参数必须是 "Quoted" 如果你想在 MixedCase
  3. 中引用它们
  4. 使用分号;终止每个语句
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() 当您在一个月中的天数之外进行加减时,会产生一些神奇效果。