У нас есть вариант использования, когда пользователь укажет время начала, время окончания и интервал в качестве параметров. и нам нужно передать эти параметры для просмотра логики там, где у нас есть бизнес-логика. Но функция Interval не принимает никаких параметров. Пожалуйста, помогите, как передать параметр для добавления интервала. ниже приведен простой пример.
set v_StartTime = to_timestamp_ntz('2024-04-01 00:00:00');
set v_EndTime = to_timestamp_ntz('2024-04-02 00:00:00');
set v_Interval = '1 HOUR';
Ниже утверждение работает в снежинке:
SELECT $v_StartTime, $v_StartTime + INTERVAL '1 HOUR' , $v_EndTime;
Нижеприведенный оператор не работает при использовании $v_Interval в качестве параметра:
SELECT $v_StartTime, ($v_StartTime + INTERVAL $v_Interval ) , $v_EndTime;
Технически вы строите запрос здесь. Вместо этого подхода выберите создание динамического запроса, а затем используйте EXECUTE IMMEDIATE для запроса, который я только что создал в виде строки.
Поскольку описанный вариант использования не очень информативен, я не могу представить, что вы хотите с этим делать прямо сейчас, поэтому мне придется немного догадаться. Но вы можете создать как UDF, так и SP, используя эти значения в качестве входных параметров.
Поддержка переменных различается в зависимости от того, что вы пытаетесь сделать. Хранимые процедуры, запросы, курсоры, циклы и пользовательские функции — поэтому то, что вам нужно здесь делать, полностью зависит от вашего варианта использования. Этот скрипт будет работать как с SnowSQL, так и с Snowsight.
Вот пример запроса с использованием ВЫПОЛНИТЬ НЕМЕДЛЕННО с динамическим запросом. Также обратите внимание, что вы можете использовать USING в EXECUTE IMMEDIATE для переменных привязки:
-- Define variables
set v_StartTime = to_timestamp_ntz('2024-04-01 00:00:00');
set v_EndTime = to_timestamp_ntz('2024-04-02 00:00:00');
set v_Interval = '1 HOUR';
-- Construct the SQL statement dynamically
set v_SQL = '
SELECT
$v_StartTime AS StartTime,
($v_StartTime + INTERVAL ''' || $v_Interval || ''') AS IntervalTime,
$v_EndTime AS EndTime
';
-- Execute the dynamic SQL
EXECUTE IMMEDIATE $v_SQL;
Вы можете использовать отдельные параметры для количества и типа интервала и передать их dateadd
set v_StartTime = to_timestamp_ntz('2024-04-01 00:00:00');
set v_EndTime = to_timestamp_ntz('2024-04-02 00:00:00');
set v_Interval = 1;
set v_IntervalType = 'hour';
select $v_StartTime, dateadd($v_IntervalType, $v_Interval, $v_StartTime), $v_EndTime;
Переменные в Snowflake многим людям совершенно непонятны, поэтому я спросил, знаете ли вы, что переменную в этом контексте нельзя вызывать внутри функции так, как вы это сделали. Теперь ваш ответ здесь отредактирован, и теперь он работает. Если вы запустите запрос так, как он был до редактирования, вы поймете, что я имею в виду.
Если бы ОП разобрался в этом сам, этого вопроса здесь бы не было. Ваш ответ был неверным, теперь это не так. Вините меня сколько хотите, но проблема здесь в том, что вы не тестируете свой код перед публикацией, и ничего больше.
@Kathmandude Спасибо! Ваше решение сработало для меня, отлично!
Вы знаете, что не можете выполнять подобные запросы, верно? Это приведет к ошибкам как в Snowsight, так и в SnowSQL.