Presto SQL date_format 提取一年中的第几周
Presto SQL date_format extract week of year
文档:https://prestodb.io/docs/current/functions/datetime.html
我有纪元时间戳,我想从中提取一年中的第几周,例如 2021-32
、2020-50
、2021-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_year
和 year_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 个位数周,如 1
、2
而不是 01
、02
- 从而导致使用这些周数排序时出现问题。
我最终使用 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'))
文档:https://prestodb.io/docs/current/functions/datetime.html
我有纪元时间戳,我想从中提取一年中的第几周,例如 2021-32
、2020-50
、2021-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_year
和 year_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 个位数周,如 1
、2
而不是 01
、02
- 从而导致使用这些周数排序时出现问题。
我最终使用 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'))