Presto SQL date_format 提取一年中的一周

Posted

技术标签:

【中文标题】Presto SQL date_format 提取一年中的一周【英文标题】:Presto SQL date_format extract week of year 【发布时间】:2022-01-06 15:06:36 【问题描述】:

文档: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 对应于 2021 年 1 月 1 日或 2021 年 1 月 2 日的 Epoch-Time。我知道这里发生了同步问题,但这绝对不是我想要的 - 我如何抵消这样一周的第一天1 从年初开始。

【问题讨论】:

如果 53 看起来太高,那么您可以从第 00 周开始吗? date_format(date('2021-01-03'), '%Y-%u')(星期日)返回 2021-00 @LukStorms 奇怪的是,我收到一个错误,即不支持 %u 作为一种格式,即使我看到它在文档中列出。 INVALID_FUNCTION_ARGUMENT: %u not supported in date format string 。我在 AWS Athena 上运行查询,它在下面使用 Presto SQL 引擎。 我的错。文档中有警告。 The following specifiers are not currently supported: %D %U %u %V %w %X 哦,好吧,可能没有多少人需要它。 【参考方案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

【讨论】:

虽然这可能有效,但它需要我添加多个强制转换 -> 首先添加到 int 以支持除以 7,然后将其重新强制转换为 varchar 以支持 concat。加上除以 7 对我来说似乎是一个黑客。我找到了对此的本地支持,请查看我的答案 - 想听听您对此的看法。【参考方案2】:

我能够使用 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 返回单位数周,例如 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'))

【讨论】:

【参考方案3】:

这里没有同步问题 - 这是date_format 的预期行为,它是 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)

相关:

马上github issue 乔达weekOfWeekyear docs

【讨论】:

以上是关于Presto SQL date_format 提取一年中的一周的主要内容,如果未能解决你的问题,请参考以下文章

从字段 sql/presto 中提取子字符串

在某个单词 Presto SQL 之后提取一个字符串

MySQL date_format(date, '%Y-%m-%d %h') 在 Presto 中相当于 `day-hour`

presto-SQL

presto-SQL

presto-SQL