南大通用GBase 8a的week函数模式实现每年的第1天总是第1周,哪怕就1天也算

按照中国习惯,每年的1月1日算第一周,即使这一天是星期日,这一周只有1天也算一周。这主要用于一些按周建表的场景,比如202001, 否则这一天的数据就没有周表可以用了。

GBase提供了一个新的weekMode来适应这个需求。

样例

2017年1月1日是星期日,这一周只有1天。

这个模式保证第一天肯定是第一周。

gbase>  SELECT YEAR('2017-01-01'), WEEK('2017-01-01',8) FROM dual;
+--------------------+----------------------+
| YEAR('2017-01-01') | WEEK('2017-01-01',8) |
+--------------------+----------------------+
|               2017 |                    1 |
+--------------------+----------------------+
1 row in set (Elapsed: 00:00:00.00)

gbase>  SELECT YEAR('2017-01-01'), WEEK('2017-01-01',9) FROM dual;
+--------------------+----------------------+
| YEAR('2017-01-01') | WEEK('2017-01-01',9) |
+--------------------+----------------------+
|               2017 |                    1 |
+--------------------+----------------------+
1 row in set (Elapsed: 00:00:00.00)

而8和9的区别就是星期日和星期一哪个是第一天的区别,比如2017-1-2在模式8里还是第一周,而模式9就是第二周了。

gbase>  SELECT YEAR('2017-01-01'), WEEK('2017-01-02',8) FROM dual;
+--------------------+----------------------+
| YEAR('2017-01-01') | WEEK('2017-01-02',8) |
+--------------------+----------------------+
|               2017 |                    1 |
+--------------------+----------------------+
1 row in set (Elapsed: 00:00:00.01)

gbase>  SELECT YEAR('2017-01-01'), WEEK('2017-01-02',9) FROM dual;
+--------------------+----------------------+
| YEAR('2017-01-01') | WEEK('2017-01-02',9) |
+--------------------+----------------------+
|               2017 |                    2 |
+--------------------+----------------------+
1 row in set (Elapsed: 00:00:00.00)

模式的说明

模式周第一天范围第一周指的是
0Sunday0-53这一年包含了一个星期日
1Monday0-53这一年包含4或更多的天数
2Sunday1-53这一年包含了一个星期日
3Monday1-53这一年包含4或更多的天数
4Sunday0-53这一年包含4或更多的天数
5Monday0-53这一年包含了一个星期一
6Sunday1-53这一年包含4或更多的天数
7Monday1-53这一年包含了一个星期一
8Sunday1-54只要有一天就算第一周
9Monday1-54只要有一天就算第一周

解析一下

比如模式7,是周一开始,且要求这一年必须包含一个星期一。
而2021-01-03这一周,是从2020-12-28 - 2021-01-13, 从2020年的周一到2021年的周日,那么他们算一周,而且属于【上一年2020年】的52周(因为周一属于2020年)。
而2021-01-04是周一,属于2021年,所以是2021年的第一周的第一天。

说明

1、周日还是还是周一开始,是第一个选项

2、周是0开始还是1开始,是第二个选项

3、是包含一个星期日,还是星期一,还是最少有4天

4、模式8和9是中国模式,只要有1天在这一年,那就算第1周,且没有0周。

参考