繁体   English   中英

计算 snowflake/sql 中 2 个特定日期之间的周数

[英]Calculate number of weeks between 2 specific dates in snowflake/sql

我正在尝试获取一年的周数

通常我们可以使用下面的 weekofyear(默认年份,从 1 月 1 日到 12 月 31 日)function 来获取我们过去的日期的周数

select (weekofyear("@date_input")) as week_number,date_input from dual

output-

week_number date_input
40          2020-10-01
40          2020-10-04
.
.
1           2021-01-04
.
.
.
39          2021-09-30


但我的要求是一年中的一周应该从 10 月 1 日开始到 9 月 30 日,当我们通过日期时

my desired output-

week_number date_input
53          2020-10-01
1           2020-10-04
.
.
13          2021-01-04
.
.
.
52          2021-09-30


所以为了实现我上面想要的 output 我正在使用下面的 sql 逻辑并且我在我们传递的日期添加 3 个月并从该日期找到周数

select (weekofyear(dateadd(month,3,"@date-value")))

上面的 sql 在 2021-10-01 到 2021-11-27 以及从 2021-11-28 到 2021-12-06 期间工作正常,周数在 9 天中显示为 9,其中同一周数应该准确为 7 天它来了 9 天

原因是当我们对 2021-11-29 和 2021-11-30 使用 dateadd 3 个月时,3 个多月是 2022 年 2 月,而 2 月没有 29 日和 30 日,因此它显示这两个日期的周数与嗯(2021-11-29 和 2021-11-30)

所以我需要帮助,是否有任何逻辑可以满足我的要求?

请就如何继续执行此逻辑提出建议

注意 - 编辑了问题

您肯定会看到dateadd()的记录行为

当 date_or_time_part 是年、季度或月(或它们的任何变体)时,如果结果月的天数少于该月的原始日期,则该月的结果日可能与原始日期不同。

我会说你遇到了weekofyear()的细微差别以及为什么存在WEEK_OF_YEAR_POLICY参数。

由于这些原因,我认为您不能使用weekofyear()而是必须实现一个 UDF,并且可能定义您自己的语义来定义 10/1 是否是第 1 周的一部分

提供一点测试 SQL like 很有帮助

with d as (select $1 weeknum, $2::date  mydate from (values (53, '2020-10-01'), (1, '2020-10-04'), (13, '2021-01-04'), (52, '2021-09-30')))
select *,weekofyear(mydate)+13,weekofyear(dateadd(week, 13, mydate)),weekofyear(dateadd(month, 3, mydate)) from d
53  2020-10-01  53  53  53
1   2020-10-04  53  53  1
13  2021-01-04  14  14  13
52  2021-09-30  52  52  52

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM