如何在雪花UDF中调用mysql函数

时间:2019-12-17 09:24:49

标签: snowflake-data-warehouse

我试图在雪花中的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
$$```

3 个答案:

答案 0 :(得分:2)

在JavaScript中创建日期函数相对容易。看下面的例子。
只要记住:

  1. 请使用DATE SQL数据类型进行输入和输出
  2. 如果要在MixedCase中引用参数,必须将其“引用”
  3. 使用分号;终止每个语句
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()在当月的几天之外进行加减运算时会产生一些魔力。

答案 1 :(得分:0)

以标量SQL UDF形式实现您的功能可以解决这种情况。或者,您可以实现自己的JavaScript日期数学。 For example。好消息是您可以从SQL UDF调用JS UDF。

答案 2 :(得分:-1)

您可能需要尝试如下操作:

创建或替换过程dbo.usp_test()   返回VARCHAR   语言javascript   作为呼叫者执行   AS
  $$
    Snow.createStatement({sqlText:“ SET dt = DATEADD(MONTH,1,CURRENT_TIMESTAMP)”}).execute();     返回“成功”;
  $$   ;

-致电ds_work.ddd.usp_test()