sql - 如何从 Redshift 中的日期查找周数、期间和年份?(周从周三开始,到周二结束)
问题描述
需要找到weekNumber
类似1,2,3,4
的,但一周从周三开始,从日期列到周二结束,在第 4 周之后,再次作为第 1 周重新开始一周,依此类推(无需考虑月份)。
只需要找到Period
基于weekNumber
,4 周作为 1 期和以 13 结束的期(期 1-13)将再次重新开始第 1 期。(4 周 = 1 期)(无需考虑月份)。
现在需要计算businessyear
基于Period
。13 个时期为一businessyear
。(13 个周期 = 1 年)
计算逻辑:
- 7 天 * 4 周 = 28 天 = 1 个周期
- 13 个时期 = 1 个工作年
例子:
- 一年通常有365天
- 在我的场景中,4 周 * 7 天 = 28 天
- 28 天 * 13 个周期 = 364 天
- 剩余的几天将作为第 5 周和第 14 期。
Datekey date Year semistor Quarter Month DayName DayNum Wnumber
20090101 01-01-2009 2009 1 1 January 1 Thursday 1 0
20090102 02-01-2009 2009 1 1 January 1 Friday 2 0
20090103 03-01-2009 2009 1 1 January 1 Saturday 3 0
20090104 04-01-2009 2009 1 1 January 1 Sunday 0
20090105 05-01-2009 2009 1 1 January 1 Monday 0
20090106 06-01-2009 2009 1 1 January 1 Tuesday 6 0
20090107 07-01-2009 2009 1 1 January 1 Wednesday 0 0
20090108 08-01-2009 2009 1 1 January 1 Thursday 1 1
20090109 09-01-2009 2009 1 1 January 1 Friday 2 1
20090110 10-01-2009 2009 1 1 January 1 Saturday 3 1
20090111 11-01-2009 2009 1 1 January 1 Sunday 4 1
20090112 12-01-2009 2009 1 1 January 1 Monday 5 1
20090113 13-01-2009 2009 1 1 January 1 Tuesday 6 1
20090114 14-01-2009 2009 1 1 January 1 Wednesday 0 1
在我的场景中无需考虑月份,还需要考虑闰年(2016 年、2020 年)。
解决方案
做这类事情的传统方法是在数据库中创建一个日历表。然后,您的查询可以简单地JOIN
向日历表中提取相关值。
我发现创建calendar
表格最简单的方法是使用 Excel。只需编写一些提供所需值的公式,然后复制下一个十年左右的时间。然后,将工作表另存为 CSV 并将其加载到数据库中。
这样,您可以完全避免涉及数据库函数的复杂计算,并且您可以使用任何您想要的规则。
推荐阅读
- mysql - SQL - 查找树结构的父级
- c# - 在 JSON 中取某个字符串并放入 RichTextBox
- maple - 在 Maple 中标记点图的交点
- flutter - 为叶子中的值取 2 个名称以进行翻译
- node.js - 我想渲染一个带有 http2 服务的标头的 node.js 页面
- python - RFECV 中的准确度值完全相同
- regex - 带方括号 [ ] 的 Splunk 字段提取
- nlp - in_channels 和 kernel_size 用于使用 Conv1d (Pytorch) 进行词嵌入
- javascript - 更新 immerjs 中的嵌套道具导致“无法分配给只读属性”异常
- html - 带有 HTML 的 Node.js HTTP 客户端