Как построить массив дат в заданном диапазоне дат, используя snowsql? - PullRequest
0 голосов
/ 11 ноября 2019

Учитывая две даты, я хотел бы создать массив, который содержит все дни между этими датами, а затем отфильтровать его, чтобы он содержал только дни, приходящиеся на конец месяца.

Например,с start_date 2019-01-31 и end_date 2019-06-30 я бы построил массив

[
  '2019-01-31',
  '2019-02-28',
  '2019-03-31',
  '2019-04-30',
  '2019-05-31',
  '2019-06-30'
]

1 Ответ

4 голосов
/ 11 ноября 2019

Немного сложно точно понять, что вы хотите, но из запрошенного вывода похоже, что массив содержит месячные даты между двумя пределами дат. Я пытался реализовать с помощью JavaScript, чтобы избежать страшной ошибки «Неподдерживаемый подзапрос», но сложно вычислить даты, отформатировать их и вернуться из JavaScript в SQL.
Поэтому я получил SQL UDF:

CREATE OR REPLACE FUNCTION ARRAY_MONTHS_BETWEEN("FROM" DATE, "TO" DATE)
RETURNS ARRAY AS 
'
  SELECT ARRAY_AGG(DATEADD(MONTH, "MONTH" , "FROM")) A
  FROM (SELECT ROW_NUMBER() OVER (ORDER BY NULL) - 1 "MONTH"
        FROM TABLE(GENERATOR(ROWCOUNT => 1000)))
  WHERE "MONTH" <= CEIL(DATEDIFF(MONTHS, "FROM", "TO"))
';

Может быть сложно использовать эту функцию, кроме как с константами даты, потому что вы рискуете открыть ящик Пандоры со связанными со снежинками подзапросами. Но опять же, может быть, нет.

...