我一直在努力从周数和年数中获取星期一。有人可以帮忙吗?我希望不要提及 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 日
我会考虑制作一个日历表,然后将 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 |