Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Generate interval from variable in Presto

Tags:

In Presto SQL, unlike regular SQL, intervals must be created with inverted commas:

INTERVAL '1' DAY 

rather than

INTERVAL 1 DAY 

I am trying to generate a set of dates as described here: https://stackoverflow.com/a/2157776/2388930, but am encountering an issue with

INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY 

How might this be achieved? I tried

parse((a.a + (10 * b.a) + (100 * c.a)) as varchar) 

but this was not successful.

like image 448
Dimpl Avatar asked Nov 30 '15 07:11

Dimpl


People also ask

How do I cast a timestamp to date in Presto?

You can convert timestamp to date with cast(col as date) or date(col) .

Is null in Presto SQL?

The IS NULL and IS NOT NULL operators test whether a value is null (undefined). Both operators work for all data types.

What is Presto database?

Presto is an open source, distributed SQL query engine designed for fast, interactive queries on data in HDFS, and others. Unlike Hadoop/HDFS, it does not have its own storage system. Thus, Presto is complimentary to Hadoop, with organizations adopting both to solve a broader business challenge.


2 Answers

This is not a direct answer to the question, but if the goal is to replicate the results described in the linked Stack Overflow question, generate days from date range, here is an alternative method to generate a sequence of dates in Presto:

SELECT     CAST(date_column AS DATE) date_column FROM     (VALUES         (SEQUENCE(FROM_ISO8601_DATE('2010-01-20'),                    FROM_ISO8601_DATE('2010-01-24'),                    INTERVAL '1' DAY)         )     ) AS t1(date_array) CROSS JOIN     UNNEST(date_array) AS t2(date_column) ; 

Output:

 date_column -------------  2010-01-20  2010-01-21  2010-01-22  2010-01-23  2010-01-24 

You can also use other INTERVAL values besides DAY and different step sizes besides '1'.

*Adapted from this issue comment, https://github.com/prestodb/presto/issues/2169#issuecomment-68521569.

like image 181
wingr Avatar answered Oct 02 '22 05:10

wingr


I ended up using date_add:

date_add('day', -(a.a + (10 * b.a) + (100 * c.a)), date_trunc('day', now())) 
like image 29
Dimpl Avatar answered Oct 02 '22 05:10

Dimpl