Пасха / Страстная пятница для Соуфлейк Дим Дим - PullRequest
0 голосов
/ 30 октября 2019

Дальнейшее развитие: приведенный ниже код удовлетворяет тому, что требовалось в предыдущих комментариях [если вы следите за историей] :), мой новый вопрос прямо ниже озадачивает меня.

Вопрос : Я хочучтобы 'Week_Of_Year' корректировался каждое воскресенье, код ниже делает это каждый понедельник .. Я пробовал 1 и 0, но через alter session для Snowflake, но не повезло! Есть идеи, как начать новую неделю по воскресеньям, а не по понедельникам (как сейчас)?

т.е. желаемый результат для Date: 1/2/2005, чтобы отразить Week_Of_Year как 2, а не 1. alter session set week_of_year_policy = 1;vs alter session set week_of_year_policy = 0;
РАБОЧИЙ КОД

create or replace temporary table test_temptable 
  ( 
   DATE_ID                 SMALLINT               NOT NULL
  ,FULL_DATE               DATE                   NOT NULL
  ,DATE                    Varchar(10)            NOT NULL
  ,YEAR                    SMALLINT               NOT NULL
  ,WEEK_OF_YEAR            SMALLINT               NOT NULL
  ,DAY_OF_YEAR             SMALLINT               NOT NULL
  ,QTR_NUMBER              SMALLINT               NOT NULL
  ,DAY_OF_QUARTER          SMALLINT               NOT NULL 
  ,MONTH_OF_YEAR           SMALLINT               NOT NULL
  ,MONTH_NAME              CHAR(3)                NOT NULL --need to have full month name, if it comes to it maybe do if logic
  ,DAY_OF_MONTH            SMALLINT               NOT NULL
  ,DAY_OF_WEEK             VARCHAR(9)             NOT NULL
  ,DAY_NAME                VARCHAR(12)            NOT NULL
  ,DAY_IS_WEEKDAY          boolean                NOT Null 
  ,DAY_IS_LAST_OF_MONTH    boolean                NOT Null
  ,DAY_OF_WEEK_IN_MONTH    SMALLINT               NOT NULL
  ,HOLIDAYUSA              VARCHAR(80)                       ----left out NOT NULL on Purpose
 --- ,DAY_IS_HOLIDAY          boolean                NOT NULL 

)
AS
    WITH MY_DATES AS (
    SELECT DATEADD(DAY, SEQ4(), '2005-01-01') AS Full_DATE 
    ,(seq8()+ 1) AS date_id
    ,DATE_TRUNC('QUARTER',Full_DATE) as Q
    ,DATEDIFF('day',Q, Full_DATE) as Day_of_Quarter
     /*logic to support Easter Day calculation */
    ,Full_DATE as SinCurDay
    ,MONTH(Full_Date) as inCurMonth
    ,YEAR(Full_Date) as inCurYear
    ,FLOOR(inCurYear/100) as inCurCent
    ,inCurYear%19 as inYear
    ,FLOOR((inCurCent-17)/25) as inYearTmp
    ,(inCurCent-FLOOR(inCurCent/4)-FLOOR((inCurCent-inYearTmp)/3)+(19*inYear)+15)%30 as inTemp2a
    ,inTemp2a-FLOOR(inTemp2a/28)*(1 - FLOOR(inTemp2a/28)*FLOOR(29/(inTemp2a+1))*FLOOR((21-inYear)/11)) as inTemp2b
    ,(inCurYear+FLOOR(inCurYear/4)+inTemp2b+2-inCurCent+FLOOR(inCurCent/4))%7 as inTemp3
    ,inTemp2b-inTemp3 as inTemp4
    ,3+FLOOR((inTemp4+40)/44) as inEastMontha
    ,inTemp4+28-31*FLOOR(inEastMontha/4) as inEastDay
    ,inEastMontha /*- 1*/ as inEastMonthb 
    ,Date_from_parts(inCurYear,inEastMonthb, inEastDay) as EasterDay
    /*End Easter Day Logic */

     /*Day of Week in Month*/
     /* CASE
            WHEN Day(Full_Date) < 8 THEN 1
            WHEN Day(Full_Date) BETWEEN 7 AND 14 then 2
            WHEN Day(Full_Date) BETWEEN 14 AND 21 then 3
            WHEN Day(Full_Date) BETWEEN 21 AND 28 then 4 
            ELSE 5 End as Day_In_Month
      */

      FROM TABLE(GENERATOR(ROWCOUNT=>365))  
  )
  SELECT date_id
        ,Full_Date
        ,to_varchar(Full_Date, 'mm/dd/yyyy')
        ,YEAR(Full_Date)
        ,WEEKOFYEAR(Full_Date) 
        ,DAYOFYEAR(Full_Date)
        ,QUARTER(Full_Date)
        ,Day_Of_Quarter + 1
        ,MONTH(Full_Date)
        ,MONTHNAME(Full_Date)
        ,DAY(Full_Date)
        ,DAYOFWEEK(Full_Date) + 1
        ,DAYNAME(Full_Date)
        /*Weekend boolean */
        ,CASE 
            WHEN DAYOFWEEK(Full_date) + 1 = 7 THEN FALSE
            WHEN DAYOFWEEK(Full_date) + 1 = 1 THEN FALSE
         ELSE TRUE END
        /*Last Day Of Month Boolean*/
        ,CASE 
            WHEN Full_Date = last_day(Full_Date) THEN True 
         ELSE FALSE END
       /*Week in Month*/
       ---,CAST(Round((day(Full_Date) +6)/7,0) as VARCHAR)
       ,CASE
            WHEN Day(Full_Date) < 8 THEN 1
            WHEN Day(Full_Date) BETWEEN 7 AND 14 then 2
            WHEN Day(Full_Date) BETWEEN 14 AND 21 then 3
            WHEN Day(Full_Date) BETWEEN 21 AND 28 then 4 
            ELSE 5 End

       /*HolidayUSA Logic */
       ,CASE 
            WHEN MONTH(Full_Date) = 10 AND DAY(Full_Date) = 31 THEN 'Halloween'
            /*ThanksGiving*/
            WHEN MONTH(Full_Date) = 11 AND DAYOFWEEK(Full_Date) + 1 = 5 AND 
                CASE 
                    WHEN Day(Full_Date) < 8 THEN 1
                    WHEN Day(Full_Date) BETWEEN 7 AND 14 then 2
                    WHEN Day(Full_Date) BETWEEN 14 AND 21 then 3
                    WHEN Day(Full_Date) BETWEEN 21 AND 28 then 4 
                ELSE 5 End = 4 
            THEN 'Thanksgiving Day' -- should I add ()

            WHEN MONTH(Full_Date) = 11 AND DAYOFWEEK(Full_Date) + 1 = 6 AND 
                CASE 
                    WHEN Day(Full_Date) < 8 THEN 1
                    WHEN Day(Full_Date) BETWEEN 7 AND 14 then 2
                    WHEN Day(Full_Date) BETWEEN 14 AND 21 then 3
                    WHEN Day(Full_Date) BETWEEN 21 AND 28 then 4 
                ELSE 5 End = 4 
            THEN 'Black Friday' -- should I add ()



            WHEN MONTH(Full_Date) = 12 AND DAY(Full_Date) = 25 THEN 'Christmas Day'
            WHEN MONTH(Full_Date) = 7 AND DAY(Full_Date) = 4 THEN 'Independence Day'
            WHEN MONTH(Full_Date) = 12 AND DAY(Full_Date) = 31 THEN 'New Years Eve'
            WHEN MONTH(Full_Date) = 1 AND DAY(Full_Date) = 1 THEN 'New Years Day'
            WHEN MONTH(Full_Date) = 5 AND DAYOFWEEK(Full_Date)+ 1 = 2 AND Day(Full_Date) > '24' then 'Memorial Day'
            WHEN MONTH(Full_Date) = 9 AND DAYOFWEEK(Full_Date) + 1 = 2 AND Day(Full_Date) < '8'THEN 'Labor Day'

            /*Martin Luther King Jr Day */
            WHEN MONTH(Full_Date) = 1 AND DAYOFWEEK(Full_Date) + 1 = 2 AND 
            CASE 
                    WHEN Day(Full_Date) < 8 THEN 1
                    WHEN Day(Full_Date) BETWEEN 7 AND 14 then 2
                    WHEN Day(Full_Date) BETWEEN 14 AND 21 then 3
                    WHEN Day(Full_Date) BETWEEN 21 AND 28 then 4 
                ELSE 5 End 
             = 3 THEN 'Martin Luther King Jr Day'


            /*Presidents Day*/
            WHEN MONTH(Full_Date) = 2 AND DAYOFWEEK(Full_Date) + 1 = 2 AND
            CASE 
                    WHEN Day(Full_Date) < 8 THEN 1
                    WHEN Day(Full_Date) BETWEEN 7 AND 14 then 2
                    WHEN Day(Full_Date) BETWEEN 14 AND 21 then 3
                    WHEN Day(Full_Date) BETWEEN 21 AND 28 then 4 
                ELSE 5 END
            = 3  THEN 'Presidents Day'






            WHEN MONTH(Full_Date) = 11 AND DAY(Full_Date) = 11 THEN 'Veterans Day' 


            /*Mothers Day */

            WHEN MONTH(Full_Date) = 5 AND DAYOFWEEK(Full_Date) + 1 = 1 AND
            CASE 
                    WHEN Day(Full_Date) < 8 THEN 1
                    WHEN Day(Full_Date) BETWEEN 7 AND 14 then 2
                    WHEN Day(Full_Date) BETWEEN 14 AND 21 then 3
                    WHEN Day(Full_Date) BETWEEN 21 AND 28 then 4 
                ELSE 5 END
            =  2 THEN 'Mothers Day'

            /*Fathers Day */
            WHEN MONTH(Full_Date) = 6 AND DAYOFWEEK(Full_Date) + 1 = 1 AND
            CASE 
                    WHEN Day(Full_Date) < 8 THEN 1
                    WHEN Day(Full_Date) BETWEEN 7 AND 14 then 2
                    WHEN Day(Full_Date) BETWEEN 14 AND 21 then 3
                    WHEN Day(Full_Date) BETWEEN 21 AND 28 then 4 
                ELSE 5 END
            = 3  THEN 'Fathers Day'




            WHEN MONTH(Full_Date) = 2 AND DAY(Full_Date) = 14 THEN 'Valentines Day'
            WHEN Full_Date = EasterDay THEN 'Easter Day'
            WHEN Full_Date = EasterDay - 2 THEN 'Good Friday'
        ELSE NULL END
      --- ,CASE
      ---      WHEN HOLIDAYUSA is not NULL THEN TRUE Else False
     ---   END

    FROM MY_DATES
    Order By Full_Date;

Развитый вопрос : Пожалуйста, просмотрите обновленный код, куда я перевел логику T-SQLРассчитать Пасху в то, что Снежинка могла понять. Единственная проблема заключается в том, что в 2005 году я ухожу на один день (код ниже возвращает 28 марта 2005 года к Пасхе, но это 27 марта 2008 года).

Вопрос: Может ли кто-нибудь помочь мне понять, почему нижняя строка настолько близка, но неправильна, я пробовал так много вариаций rtrim, RIGHT и других манипуляций со значениями, которые питают дату, думая, что она имеет отношение кокругление вниз, но все, что делает возвращение пасхи, датируются еще дальше. Ниже мой самый близкий для 20-летнего промежутка, все в пределах приблизительно 1-5 дней фактического.

Строка, вызывающая ошибку: date_from_parts(YR, '0' + rtrim(EasterMonth),'0' + rtrim(EasterDay)) AS test6

Easter Logic

(24 + 19 * (YR % 19)) % 30 AS EpactCalc, 
        EpactCalc - (EpactCalc / 28) AS PaschalDaysCalc, 
        PaschalDaysCalc - ((YR + YR / 4 + PaschalDaysCalc - 13) % 7) AS NumOfDaysToSunday, 
        3 + (NumOfDaysToSunday + 40) / 44 AS EasterMonth, 
        NumOfDaysToSunday + 28 - (31 * (EasterMonth / 4)) AS EasterDay, ---EasterMonth + RTRIM(YR) as test6
        ---to_date_from_parts(YR,(("0" + EasterMonth).substr(-2)), (("0" + EasterDay).substr(-2)) as test6
        date_from_parts(YR, '0' + rtrim(EasterMonth),'0' + rtrim(EasterDay)) AS test6

Полный сценарий:

CREATE OR REPLACE
TEMPORARY TABLE .test_temptable (Date_Id SMALLINT NOT NULL ,Full_Date DATE NOT NULL ,Date Varchar(10) NOT NULL ,YEAR SMALLINT NOT NULL ,WEEK_OF_YEAR SMALLINT NOT NULL ,DAY_OF_YEAR SMALLINT NOT NULL ,QTR_Number SMALLINT NOT NULL ,Day_Of_Quarter SMALLINT NOT NULL,MONTH_OF_YEAR SMALLINT NOT NULL ,MONTH_NAME CHAR(3) NOT NULL --need to have full month name, if it comes to it maybe do if logic
 ,DAY_OF_MONTH SMALLINT NOT NULL ,DAY_OF_WEEK VARCHAR(9) NOT NULL ,DAY_NAME VARCHAR(12) NOT NULL ,DAY_IS_WEEKDAY boolean NOT NULL,DAY_IS_LAST_OF_MONTH boolean NOT NULL ,DAY_OF_WEEK_IN_MONTH SMALLINT NOT NULL ,HOLIDAYUSA VARCHAR(80) ----left out NOT NULL on Purpose
 ,test1 smallint NOT NULL,test2 smallint NOT NULL ,test3 smallint NOT NULL ,test4 smallint NOT NULL,test5 smallint NOT NULL ,test6 DATE NOT NULL) AS WITH CTE_MY_DATE AS
  (---Returns a sequence of monotonically increasing integers, with wrap-around. Wrap-around occurs after the largest representable integer of the integer width (1, 2, 4, or 8 byte)..??I'd like to understand this a tad bit better.Is SEQ4 for float?
 SELECT DATEADD(DAY, SEQ4(), '2005-01-01') AS Full_DATE, 
        YEAR(Full_Date) AS YR, 
        (seq8()+ 1) AS date_id, 
        DATE_TRUNC('QUARTER',Full_DATE) AS q, 
        DATEDIFF('day',q, Full_DATE) AS Day_of_Quarter, 
        (24 + 19 * (YR % 19)) % 30 AS EpactCalc, 
        EpactCalc - (EpactCalc / 28) AS PaschalDaysCalc, 
        PaschalDaysCalc - ((YR + YR / 4 + PaschalDaysCalc - 13) % 7) AS NumOfDaysToSunday, 
        3 + (NumOfDaysToSunday + 40) / 44 AS EasterMonth, 
        NumOfDaysToSunday + 28 - (31 * (EasterMonth / 4)) AS EasterDay, ---EasterMonth + RTRIM(YR) as test6
        ---to_date_from_parts(YR,(("0" + EasterMonth).substr(-2)), (("0" + EasterDay).substr(-2)) as test6
        date_from_parts(YR, '0' + rtrim(EasterMonth),'0' + rtrim(EasterDay)) AS test6 


   FROM TABLE(GENERATOR(ROWCOUNT=>9125)) 
 ) 
SELECT date_id ,
       Full_Date ,
       to_varchar(Full_Date, 'mm/dd/yyyy') ,
       YEAR(Full_Date) ,
       WEEKOFYEAR(Full_Date) ,
       DAYOFYEAR(Full_Date) ,
       QUARTER(Full_Date) ,
       Day_Of_Quarter + 1 ,
       MONTH(Full_Date) ,
       MONTHNAME(Full_Date) ,
       DAY(Full_Date) ,
       DAYOFWEEK(Full_Date) + 1 ,
       DAYNAME(Full_Date) ---calculates if it is on weekend or not
 ,
       CASE 
           WHEN DAYOFWEEK(Full_date) = 7 THEN FALSE 
           WHEN DAYOFWEEK(Full_date) = 1 THEN FALSE 
           ELSE TRUE 
       END ----calculates if last day of month 
 ,
       CASE 
           WHEN Full_Date = last_day(Full_Date) THEN TRUE 
           ELSE FALSE 
       END,
       CAST(Round((day(Full_Date) +6)/7,0) AS VARCHAR) -- this is what week you are in in the month, double check that what it ought to be 
 --- calculates holidays, is Thxgiving always in the fifth week?, 
 ,
       CASE 
           WHEN MONTH(Full_Date) = 10
                AND DAY(Full_Date) = 31 THEN 'Halloween' 
           WHEN MONTH(Full_Date) = 11
                AND DAYOFWEEK(Full_Date) + 1 = 4
                AND CAST(Round((day(Full_Date) +6)/7,0) AS VARCHAR) = 5 THEN 'Thanksgiving Day' 
           WHEN MONTH(Full_Date) = 12
                AND DAY(Full_Date) = 25 THEN 'Christmas Day' 
           WHEN MONTH(Full_Date) = 7
                AND DAY(Full_Date) = 4 THEN 'Independence Day' --adding

           WHEN MONTH(Full_Date) = 12
                AND DAY(Full_Date) = 31 THEN 'New Years Eve' 
           WHEN MONTH(Full_Date) = 1
                AND DAY(Full_Date) = 1 THEN 'New Years Day' ---memorial day attempt

           WHEN MONTH(Full_Date) = 5
                AND DAYOFWEEK(Full_Date)+ 1 = 2
                AND Day(Full_Date) > '24' THEN 'Memorial Day' ---labor day

           WHEN MONTH(Full_Date) = 9
                AND DAYOFWEEK(Full_Date) + 1 = 2
                AND Day(Full_Date) < '8'THEN 'Labor Day' 
           WHEN MONTH(Full_Date) = 1
                AND DAYOFWEEK(Full_Date) = 2
                AND CAST(Round((day(Full_Date) +6)/7,0) AS VARCHAR) = 3 THEN 'Martin Luther King Jr Day' 
           WHEN MONTH(Full_Date) = 2
                AND DAYOFWEEK(Full_Date) = 2
                AND CAST(Round((day(Full_Date) +6)/7,0) AS VARCHAR) = 3 THEN 'Presidents Day' 
           WHEN MONTH(Full_Date) = 11
                AND DAY(Full_Date) = 11 THEN 'Veterans Day' ---added Mother's Day

           WHEN MONTH(Full_Date) = 5
                AND DAYOFWEEK(Full_Date) + 1 = 1
                AND CAST(Round((day(Full_Date) +6)/7,0) AS VARCHAR) = 2 THEN 'Mothers Day'
           WHEN MONTH(Full_Date) = 6
                AND DAYOFWEEK(Full_Date) + 1 = 1
                AND CAST(Round((day(Full_Date) +6)/7,0) AS VARCHAR) = 3 THEN 'Fathers Day'
           WHEN MONTH(Full_Date) = 2
                AND DAY(Full_Date) = 14 THEN 'Valentines Day' ---easter
 ---good friday

           ELSE NULL
       END ,
       EpactCalc ,
       PaschalDaysCalc ,
       NumOfDaysToSunday ,
       EasterMonth ,
       EasterDay ,
       test6
FROM CTE_MY_DATE;

Старый вопрос: У меня есть этот прекрасный кусок кода для пользователей снежинок, который мне нужно немного помочь закончить. Я специально хочу использовать второй кусок кода, который был написан для SqlServer, который будет использоваться в Snowflakes env и интегрирован в мой скрипт ниже (первый кусок кода).

В частности: a) «Как интегрировать функцию в запрос, подобный этому», как в Совете, где разместить код внутри моего скрипта выше, потому что у меня возникают проблемы с пониманием того, как интегрировать функцию в оператор выбораб) «Есть ли что-то ослепительное в этом запросе, которое сделало бы его выполнение в Snowflake уникально трудным?» Я попытался запустить SQLServer «пасхальную дату» в одиночку внутри снежинки и изменил переменные в соответствии с требованиями к снежинкам (т. е. вывести @) итогда я получил ошибку unexpected 'BEGIN'.

    CREATE OR REPLACE
TEMPORARY TABLE test_temptable (Date_Id SMALLINT NOT NULL ,Full_Date DATE NOT NULL ,Date Varchar(10) NOT NULL ,YEAR SMALLINT NOT NULL ,WEEK_OF_YEAR SMALLINT NOT NULL ,DAY_OF_YEAR SMALLINT NOT NULL ,QTR_Number SMALLINT NOT NULL ,Day_Of_Quarter SMALLINT NOT NULL,MONTH_OF_YEAR SMALLINT NOT NULL ,MONTH_NAME CHAR(3) NOT NULL 
 ,DAY_OF_MONTH SMALLINT NOT NULL ,DAY_OF_WEEK VARCHAR(9) NOT NULL ,DAY_NAME VARCHAR(12) NOT NULL ,DAY_IS_WEEKDAY boolean NOT NULL,DAY_IS_LAST_OF_MONTH boolean NOT NULL ,DAY_OF_WEEK_IN_MONTH SMALLINT NOT NULL ,HOLIDAYUSA VARCHAR(80) 
  (
 SELECT DATEADD(DAY, SEQ4(), '2005-01-01') AS Full_DATE, 
        (seq8()+ 1) AS date_id, 
        DATE_TRUNC('QUARTER',Full_DATE) AS q, 
        DATEDIFF('day',q, Full_DATE) AS Day_of_Quarter

   FROM TABLE(GENERATOR(ROWCOUNT=>366)) 
 ) 
SELECT date_id ,
       Full_Date ,
       to_varchar(Full_Date, 'mm/dd/yyyy') ,
       YEAR(Full_Date) ,
       WEEKOFYEAR(Full_Date) ,
       DAYOFYEAR(Full_Date) ,
       QUARTER(Full_Date) ,
       Day_Of_Quarter + 1 ,
       MONTH(Full_Date) ,
       MONTHNAME(Full_Date) ,
       DAY(Full_Date) ,
       DAYOFWEEK(Full_Date) + 1 ,
       DAYNAME(Full_Date)
 ,
       CASE 
           WHEN DAYOFWEEK(Full_date) = 7 THEN FALSE 
           WHEN DAYOFWEEK(Full_date) = 1 THEN FALSE 
           ELSE TRUE 
       END 
 ,
       CASE 
           WHEN Full_Date = last_day(Full_Date) THEN TRUE 
           ELSE FALSE 
       END,
       CAST(Round((day(Full_Date) +6)/7,0) AS VARCHAR) 
 ,
       CASE 
           WHEN MONTH(Full_Date) = 10
                AND DAY(Full_Date) = 31 THEN 'Halloween' 
           WHEN MONTH(Full_Date) = 11
                AND DAYOFWEEK(Full_Date) + 1 = 4
                AND CAST(Round((day(Full_Date) +6)/7,0) AS VARCHAR) = 5 THEN 'Thanksgiving Day' 
           WHEN MONTH(Full_Date) = 12
                AND DAY(Full_Date) = 25 THEN 'Christmas Day' 
           WHEN MONTH(Full_Date) = 7
                AND DAY(Full_Date) = 4 THEN 'Independence Day' --adding

           WHEN MONTH(Full_Date) = 12
                AND DAY(Full_Date) = 31 THEN 'New Years Eve' 
           WHEN MONTH(Full_Date) = 1
                AND DAY(Full_Date) = 1 THEN 'New Years Day' ---memorial day attempt

           WHEN MONTH(Full_Date) = 5
                AND DAYOFWEEK(Full_Date)+ 1 = 2
                AND Day(Full_Date) > '24' THEN 'Memorial Day' ---labor day

           WHEN MONTH(Full_Date) = 9
                AND DAYOFWEEK(Full_Date) + 1 = 2
                AND Day(Full_Date) < '8'THEN 'Labor Day' 
           WHEN MONTH(Full_Date) = 1
                AND DAYOFWEEK(Full_Date) = 2
                AND CAST(Round((day(Full_Date) +6)/7,0) AS VARCHAR) = 3 THEN 'Martin Luther King Jr Day' 
           WHEN MONTH(Full_Date) = 2
                AND DAYOFWEEK(Full_Date) = 2
                AND CAST(Round((day(Full_Date) +6)/7,0) AS VARCHAR) = 3 THEN 'Presidents Day' 
           WHEN MONTH(Full_Date) = 11
                AND DAY(Full_Date) = 11 THEN 'Veterans Day' ---added Mother's Day

           WHEN MONTH(Full_Date) = 5
                AND DAYOFWEEK(Full_Date) + 1 = 1
                AND CAST(Round((day(Full_Date) +6)/7,0) AS VARCHAR) = 2 THEN 'Mothers Day'
           WHEN MONTH(Full_Date) = 6
                AND DAYOFWEEK(Full_Date) + 1 = 1
                AND CAST(Round((day(Full_Date) +6)/7,0) AS VARCHAR) = 3 THEN 'Fathers Day'
           WHEN MONTH(Full_Date) = 2
                AND DAY(Full_Date) = 14 THEN 'Valentines Day' ---easter
 ---good friday

           ELSE NULL
       END
FROM CTE_MY_DATE;

Ниже приведен код SQLServer, мне нужна помощь для ввода вышеуказанного !! (спасибо Функция возврата даты Пасхи за данный год )

    CREATE FUNCTION dbo.GetEasterSunday 
( @Y INT ) 
RETURNS SMALLDATETIME 
AS 
BEGIN 
    DECLARE     @EpactCalc INT,  
        @PaschalDaysCalc INT, 
        @NumOfDaysToSunday INT, 
        @EasterMonth INT, 
        @EasterDay INT 

    SET @EpactCalc = (24 + 19 * (@Y % 19)) % 30 
    SET @PaschalDaysCalc = @EpactCalc - (@EpactCalc / 28) 
    SET @NumOfDaysToSunday = @PaschalDaysCalc - ( 
        (@Y + @Y / 4 + @PaschalDaysCalc - 13) % 7 
    ) 

    SET @EasterMonth = 3 + (@NumOfDaysToSunday + 40) / 44 

    SET @EasterDay = @NumOfDaysToSunday + 28 - ( 
        31 * (@EasterMonth / 4) 
    ) 

    RETURN 
    ( 
        SELECT CONVERT 
        (  SMALLDATETIME, 
                 RTRIM(@Y)  
            + RIGHT('0'+RTRIM(@EasterMonth), 2)  
            + RIGHT('0'+RTRIM(@EasterDay), 2)  
        ) 
    ) 

END 
GO

1 Ответ

3 голосов
/ 30 октября 2019

Новый ответ : Вы должны использовать числовые значения месяца и дня напрямую, а не переформатировать их как ТЕКСТ:

DATE_FROM_PARTS(Year, EasterMonth, EasterDay)

Старый ответ :
СледуетПроще всего преобразовать свою функцию T-SQL в функцию JavaScript Snowflake.
Возможно, вам придется изучить JavaScript в пути.

Скелет такой функции может быть:

CREATE OR REPLACE FUNCTION GetEasterSunday(Y FLOAT) RETURNS STRING LANGUAGE JAVASCRIPT AS
$$
  var EpactCalc = (24 + 19 * (Y % 19)) % 30;
  // more stuff here
  var EasterMonth = 4, EasterDay = 21;
  return Y + "-" + ("0" + EasterMonth).substr(-2) + "-" + ("0" + EasterDay).substr(-2);
$$;
SELECT GetEasterSunday(2019)::DATE; 
...