SQL 查询无法从周数和年份获取星期一

问题描述 投票:0回答:1

我一直在努力从周数和年数中获取星期一。有人可以帮忙吗?我希望不要提及 1900-01-01,因为对于 2022 年,我的查询返回的日期是星期六,而 2023 年的查询返回的日期是星期日。

这是我正在使用的查询:

dateadd(week, weeknum - 1, dateadd(year, yearnum - 1900, '1900-01-01'))

要添加更多内容,问题是我不想仅引用 -01-01,因为例如,如果数据显示 2022 年第 50 周,则它会返回到 2022 年 12 月 10 日,而它应该返回到 2022 年 12 月 12 日。

如有任何帮助,我们将不胜感激。

谢谢

例如 2022 年和第 50 周的输出应为 2022 年 12 月 12 日

sql dbeaver
1个回答
0
投票

我会考虑制作一个日历表,然后将 YEAR、DOW 和 WEEK 标准输入到查询的 where 子句中。下面的递归 CTE 是创建日历表的一种有用方法。

RANK()
窗口函数,如下所示,计算每年该星期几出现的次数并对它们进行排名。不要将其与日期部分(周)混淆,因为它是不同的。

例如,2022 年 12 月 12 日是 2022 年的第 50 个星期一。我假设您正在寻找年份的第 N 个道琼斯指数,这就是为什么它写成如下。

create table calendar(
  cal_dt DATE, 
  year int, 
  dow int, 
  dow_ytd int
  );
--populate calendar table
with cte as (
  select convert(date, '2022-01-01') as cal_dt --start date
  union all
  select dateadd(day, 1, cal_dt)
  from cte
  where cal_dt <= '2049-12-31' --end date
  )
insert into calendar
select 
  cal_dt, 
  datepart(year, cal_dt) as year, 
  datepart(weekday, cal_dt) as dow, 
  rank() over (partition by datepart(year, cal_dt), datepart(weekday, cal_dt) order by cal_dt) as dow_ytd 
from cte
option (maxrecursion 32767);
select 
  cal_dt
from 
  calendar
where 
  year = 2022
  and dow_ytd = 50 --the Nth occurance of your targeted dow
  and dow = 2 --Monday

cal_dt
2022-12-12

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.