Snowflake cloud data platform 如何在snowflake UDF中调用mysql函数

Snowflake cloud data platform 如何在snowflake UDF中调用mysql函数,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,我正试图在snowflake中编写下面的UDF,但它不允许使用sql函数,如日期、日期添加、dayofweek。任何其他想法都会有帮助。谢谢 CREATE OR REPLACE FUNCTION getShippingDate(deliveryDate varchar,deliveryCountryCode varchar, holidayList varchar,deliveryDays varchar) RETURNS VARCHAR LANGUAGE JAVASCRIPT AS $$

我正试图在snowflake中编写下面的UDF,但它不允许使用sql函数,如日期、日期添加、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 返回VARCHAR 语言javascript 以调用方身份执行 像 $$ snowflake.createStatement{sqlText:SET dt=DATEADDMONTH,1,CURRENT_TIMESTAMP}.execute; 回归"成功",; $$ ;


-调用ds_work.ddd.usp_test将函数实现为标量SQLUDF可以解决这种情况下的问题。或者您可以实现自己的javascript日期数学。好消息是,您可以从SQL UDF调用JS UDF。

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

请使用日期SQL数据类型进行输入和输出 如果要在MixedCase中引用参数,则必须引用这些参数 使用分号;终止每个语句
当您在一个月的天数之外进行加减操作时,“新日期”会发挥一些魔力。

谢谢您的努力,但我希望在UDF中使用相同的日期,以便在select查询中使用相同的日期。当然,这在存储过程中是可能的。顺便说一句,SQL DATE\u FROM\u PARTS与new DATE有着相同的魔力,例如,DATE\u FROM\u PARTS ear,1,0可以为您提供前一年的除夕夜。嗨,Hans,非常感谢。我看到了,但我不能在snowflake中使用它,我在snowflake文档中没有看到这种示例。谢谢你的想法,我有一些新的东西要学。不客气,文档中的例子有些单薄。我最终尝试了所有东西的参数,这很耗时。但有时是值得的。我的例子中的DATE_FROM_PARTS也有不足之处。该函数具有与DATEADD类似的属性。月和日参数可以是任意数字。例如,在日期中,来自日期部分2019、13、32的月份和日期都会溢出,最终的结果是2020-02-01。
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);