本文介绍,在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)