We're Moving!

The Vertica Forum is moving to a new OpenText Analytics Database (Vertica) Community.

Join us there to post discussion topics, learn about

product releases, share tips, access the blog, and much more.

Create My New Community Account Now


declare a variable inside a function — Vertica Forum

declare a variable inside a function

Hi!
I need to cast input value into string and than use it within the interval option.
Can I declare a variable inside a function?
The use is for: "current_timestamp + interval to_char(input) minute"
the input is numeric.

Best Answer

Answers

  • marcothesanemarcothesane - Select Field - Administrator

    Why would you need to do that?

    I know three - all pretty intuitive - ways to add minutes to timestamps.

    • knowing that a minute is 1/1440 of a day, add n times 1/1440 to an input timestamp
    • use the de-facto standard TIMESTAMPADD(<_date_part_>,<_counter_>,<_datetime_val_>) function
    • cast the integer to VARCHAR(2), concatenate '00:' in front of it; cast the resulting string of, for example , '00:3', as an INTERVAL (by putting a pair of round parentheses around the concatenation operation - so it does not try to cast just the integer cast to VARCHAR, to INTERVAL)
    WITH
    mi(mi) AS (
                SELECT 1
      UNION ALL SELECT 2
      UNION ALL SELECT 3
      UNION ALL SELECT 4
      UNION ALL SELECT 5
      UNION ALL SELECT 6
    )
    SELECT
      CURRENT_TIMESTAMP                                     AS current_ts
    , CURRENT_TIMESTAMP + (mi / 1440)                       AS just_add_1_over_1440
    , TIMESTAMPADD('mi',mi,CURRENT_TIMESTAMP)               AS use_timestampadd
    , CURRENT_TIMESTAMP + ('00:'||mi::varchar(2))::INTERVAL AS cast_to_string_and_add_interval
    FROM mi;
              current_ts           |     just_add_1_over_1440      |       use_timestampadd        | cast_to_string_and_add_interval 
    -------------------------------+-------------------------------+-------------------------------+---------------------------------
     2023-09-14 12:20:38.422197+02 | 2023-09-14 12:21:38.422197+02 | 2023-09-14 12:21:38.422197+02 | 2023-09-14 12:21:38.422197+02
     2023-09-14 12:20:38.422197+02 | 2023-09-14 12:22:38.422197+02 | 2023-09-14 12:22:38.422197+02 | 2023-09-14 12:22:38.422197+02
     2023-09-14 12:20:38.422197+02 | 2023-09-14 12:23:38.422197+02 | 2023-09-14 12:23:38.422197+02 | 2023-09-14 12:23:38.422197+02
     2023-09-14 12:20:38.422197+02 | 2023-09-14 12:24:38.422197+02 | 2023-09-14 12:24:38.422197+02 | 2023-09-14 12:24:38.422197+02
     2023-09-14 12:20:38.422197+02 | 2023-09-14 12:25:38.422197+02 | 2023-09-14 12:25:38.422197+02 | 2023-09-14 12:25:38.422197+02
     2023-09-14 12:20:38.422197+02 | 2023-09-14 12:26:38.422197+02 | 2023-09-14 12:26:38.422197+02 | 2023-09-14 12:26:38.422197+02
    

    It does not figure with me why you should want to create a function for that ...

  • VValdarVValdar Vertica Employee Employee

    I got one more expression I like to use as well, it is to multiply your input by the interval 1 minute:

    with cte_input (mi) as
    (
    select 1 union all
    select 2 union all
    select 3 union all
    select 4 union all
    select 5 union all
    select 6
    )
      select mi
           , current_timestamp(0) + mi * interval '1 minute' as new_time
        from cte_input
    order by 1;
    
    mi  new_time           
    --  -------------------
     1  2023-09-14 12:30:29
     2  2023-09-14 12:31:29
     3  2023-09-14 12:32:29
     4  2023-09-14 12:33:29
     5  2023-09-14 12:34:29
     6  2023-09-14 12:35:29
    

Leave a Comment

BoldItalicStrikethroughOrdered listUnordered list
Emoji
Image
Align leftAlign centerAlign rightToggle HTML viewToggle full pageToggle lights
Drop image/file