Presto SQL date_format 提取一年中的第几周

Presto SQL date_format extract week of year

文档:https://prestodb.io/docs/current/functions/datetime.html

我有纪元时间戳,我想从中提取一年中的第几周,例如 2021-322020-502021-02 等等。

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

但是我得到了一些错误的值,例如: week = 2021-53 for Epoch-Time 对应于 2021 年 1 月 1 日或 2021 年 1 月 2 日。我知道这里发生了同步问题,但这绝对不是我想要的 - 我如何抵消第一天第 1 周从年初开始。

在那种情况下,您应该只计算天数并计算周数。 像这样:

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

此处没有同步问题 - 它符合 date_format and it's MySQL counterpart.

的预期行为

请注意,您可以在日期上使用完整格式字符串:

select date_format(timestamp '2021-01-01', '%Y-%v')
_col0
2021-53

您可以尝试将 day_of_year 除以 7 来计算周数:

select ceiling(day_of_year(timestamp '2021-01-01') / 7.0)

相关:

我能够使用 week_of_yearyear_of_week 方法解决它。
文档:https://prestodb.io/docs/current/functions/datetime.html#week

查询:

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

由于 concat 不支持多种数据类型,因此不得不向 varchar 引入一些额外的转换。

编辑: 上述解决方案的另一个问题是 week_of_year returns 个位数周,如 12 而不是 0102 - 从而导致使用这些周数排序时出现问题。

我最终使用 year_of_week 的组合来获得正确的年份,并使用一般的 date_format(date, '%v') 来获得周数。

更新查询:

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'))