sql - 根据周数,月和年sql获取周周期
问题描述
我需要根据周数、年数和月数获取一周的第一天和最后一天
我的一周从星期六开始,到星期五结束 示例:年:2020 周:45
正常一周:第一天:2020-10-31 ~ 最后一天:2020-11-06
我需要返回类似的东西
十月:第一天:2020-10-31~最后一天:2020-10-31
11月:2020-11-01第一天~最后一天:2020-11-06
我的查询返回一周的最后一天:
select DATEADD (WEEK, @PcpSemana, DATEADD (YEAR, ('20' + LEFT(@PcpPeriodo,2))-1900, 0)) - 5 as lastDayOfWeek
我的查询返回一周的第一天
SELECT WeekStart = DATEADD(DAY,
(CEILING(DATEPART(DAY, DATEADD (WEEK, @PcpSemana, DATEADD (YEAR, ('20' + LEFT(@PcpPeriodo,2))-1900, 0)) - 5) / 7.0) - 1) * 7,
DATEADD(MONTH, DATEDIFF(MONTH, 0,DATEADD (WEEK, @PcpSemana, DATEADD (YEAR, ('20' + LEFT(@PcpPeriodo,2))-1900, 0)) - 5), 0));
我正在使用 SET DATEFIRST 6
我不能进化太多
PcpPeriodo 包含 YYMM (2011) = 2020 / 11) PcpSemana 包含周数 (45) (01 ~ 53)
解决方案
我不确定你的数据是什么样的,但如果你有一周的第一天,你可以将它分成几个月:
select weeks.*
from (values (convert(date, '2020-10-31'))) w(weekstart) cross apply
(values (dateadd(day, 6, w.weekstart), eomonth(w.weekstart))
) v(weekend, eom) cross apply
(values (w.weekstart,
case when v1.weekend <= v1.eom then v1.weekend else v1.eom end
),
(case when v1.weekend > v1.eom then dateadd(day, 1, v1.eom) end,
case when v1.weekend > 1.eom then v1.weekend
)
) weeks(weekstart, weekend)
where weeks.weekstart is not null;
这是apply
用作存储中间结果的一种方式,例如当月的最后一天和一周结束的时间。
推荐阅读
- java - 将sql表数据加载到hazelcast中
- apache-kafka - 卡夫卡消费者 UNKNOWN_TOPIC_OR_PARTITION
- c++ - 如果 try-catch 下降,C++ 重新调用函数?
- firebase - 将 Firebase 导出到 Bigquery 数据集的生存时间
- reactjs - 如何从 reactjs 中的事件处理程序访问更新的状态
- html - 按钮上的按钮转换:活动
- python - 创建一个可视化指标图,将收益分为高、正常和低
- java - 如何在 Maven 子模块中添加 Java Azure Functions
- angularjs - AngularJs - 在没有控制器的情况下分配和重新定义变量,打破循环
- flask - 使用域名在 IIS 中托管 Flask 应用程序的最佳实践