Skip to content
Advertisement

Presto SQL date_format extract week of year

Documentation : https://prestodb.io/docs/current/functions/datetime.html

I have epoch timestamps from which I want to extract week of the year like 2021-32, 2020-50, 2021-02 and so on.

SELECT concat(date_format(from_unixtime((CAST(my_timestamp AS BIGINT) + 19800000)/1000), '%Y'), 
            '-' ,
            date_format(from_unixtime((CAST(my_timestamp AS BIGINT) + 19800000)/1000), '%v')) 
AS week

However I am getting up some wrong values like : week = 2021-53 for Epoch-Time corresponding to Jan 1, 2021 or Jan 2, 2021. I understand that there is a sync issue happening here but that is definitely not something I want – How do I offset so that first day of week 1 starts from the beginning of the year.

Advertisement

Answer

I was able to solve it using week_of_year and year_of_week methods.
Docs : https://prestodb.io/docs/current/functions/datetime.html#week

Query :

SELECT concat(CAST(year_of_week(from_unixtime((CAST(my_timestamp AS BIGINT) + 19800000)/1000)) AS varchar(15)),
              '-',
              CAST(week_of_year(from_unixtime((CAST(my_timestamp AS BIGINT) + 19800000)/1000)) AS varchar(15))) as week

Had to introduce some extra casts to varchar since concat doesn’t support multiple datatypes.

Edit : Another issue with above solution is that week_of_year returns single-digit weeks like 1, 2 instead of 01, 02 – thus causing an issue while sorting with these week numbers.

I ended up using a combination of year_of_week to get the correct year, and the general date_format(date, '%v') for week-numbers.

Updated Query :

SELECT concat(CAST(year_of_week(from_unixtime((CAST(my_timestamp AS BIGINT) + 19800000)/1000)) AS varchar(15)),
              '-',
              date_format(from_unixtime((CAST(my_timestamp AS BIGINT) + 19800000)/1000), '%v'))
User contributions licensed under: CC BY-SA
8 People found this is helpful
Advertisement