南大通用GBase 8a数据库获得本周的第一天,指定日期所在周的第一天的方法

本文介绍,在GBase 8a数据库里,通过内置的函数,计算本周的第一天,指定周的第一天,指定日期所在周的第一天的方法。包括星期日或星期一是周第一天的情况。

实现原理

通过weekday计算日期所在的星期内的位置,然后从日期里减去这个时间即可得到第一天的时间。

subdate和date_sub功能一致,默认是天数。

如果是星期一是第一天,使用weekday函数,返回值是从0-6。星期索引(0=Monday,1=Tuesday,…6=Sunday)

select subdate(@d,weekday(@d));

如果是星期日是第一天,使用 dayofweek函数(1 = Sunday, 2 = Monday, …, 7 = Saturday)

select subdate(@d,dayofweek(@d)-1);

注意

跨年时,第一天到底是本年第一天,还是本周第一天,这个要提前明确了。否则你拿到的是去年的一个日期,作为那一周的第一天了。

本周第一天

gbase> set @d=now();
Query OK, 0 rows affected (Elapsed: 00:00:00.00)

gbase> select subdate(@d,weekday(@d));
+-------------------------+
| subdate(@d,weekday(@d)) |
+-------------------------+
| 2021-01-04 10:58:21     |
+-------------------------+
1 row in set (Elapsed: 00:00:00.00)

跨年没有星期一的星期

比如2021-01-01所在的星期的第一天,是2020年的,所以...这和我们普通理解的有歧义。


gbase> set @d='2021-01-01';
Query OK, 0 rows affected (Elapsed: 00:00:00.00)

gbase> select subdate(@d,weekday(@d));
+-------------------------+
| subdate(@d,weekday(@d)) |
+-------------------------+
| 2020-12-28 00:00:00     |
+-------------------------+
1 row in set (Elapsed: 00:00:00.00)

指定日期所在周的第一天

如下例子计算2021-01-17所在周的第一天。

gbase> set @d='2021-01-07';
Query OK, 0 rows affected (Elapsed: 00:00:00.00)
gbase> select subdate(@d,weekday(@d));
+-------------------------+
| subdate(@d,weekday(@d)) |
+-------------------------+
| 2021-01-11 00:00:00     |
+-------------------------+
1 row in set (Elapsed: 00:00:00.00)

指定日期所在周的第n天。

方法就是少减去几天就是了。比如你要计算第5天,那就在再少减去4天。

gbase> set @d='2021-01-17';
Query OK, 0 rows affected (Elapsed: 00:00:00.00)

gbase> select subdate(@d,weekday(@d));
+-------------------------+
| subdate(@d,weekday(@d)) |
+-------------------------+
| 2021-01-11 00:00:00     |
+-------------------------+
1 row in set (Elapsed: 00:00:00.00)

gbase> select subdate(@d,weekday(@d)-4);
+---------------------------+
| subdate(@d,weekday(@d)-4) |
+---------------------------+
| 2021-01-15 00:00:00       |
+---------------------------+
1 row in set (Elapsed: 00:00:00.00)

如果是星期日是第一天

可以用dayofweek函数,代替weekday, 其采用1 = Sunday, 2 = Monday, …, 7 = Saturday

gbase> set @d='2021-01-01';
Query OK, 0 rows affected (Elapsed: 00:00:00.00)


gbase> select subdate(@d,dayofweek(@d)-1);
+-----------------------------+
| subdate(@d,dayofweek(@d)-1) |
+-----------------------------+
| 2020-12-27 00:00:00         |
+-----------------------------+
1 row in set (Elapsed: 00:00:00.01)

gbase> set @d='2021-01-07';
Query OK, 0 rows affected (Elapsed: 00:00:00.00)

gbase> select subdate(@d,dayofweek(@d)-1);
+-----------------------------+
| subdate(@d,dayofweek(@d)-1) |
+-----------------------------+
| 2021-01-03 00:00:00         |
+-----------------------------+
1 row in set (Elapsed: 00:00:00.00)

参考

计算指定周的日期

日期增减函数