MySQL 具有特定一周第一天的周数

MySQL week number with specific first day of the week

使用 MySQL WEEK 函数,我可以将一周的第一天设置为星期日或星期一。但是如果我需要将它设置为其他日期呢?

这样做的原因是我们有客户通过每周有特定“签到日”的在线程序。有的是周一,有的是周二,有的是周三等等,我们需要查看每周多次签到的平均值。

如果一直是星期天和星期一,我可以这样做:

SELECT YEAR(timestamp) AS year, WEEK(timestamp,1) AS week ... GROUP BY year, week

但是有成千上万的客户,我需要获得每个客户的每周平均值,但是每个客户都有自己一周的第一天——周一到周日、周三到周二、周六到周五等等.

有什么想法可以做到这一点吗?

感谢您的帮助!

我称你的时间戳为 time,以免与数据类型混淆:

CREATE TABLE clientdates(client VARCHAR(20),
                         time   TIMESTAMP)

我建议您从时间中减去您在评论中称为 entry_due_atDAYOFWEEK("check-in day")。然后您将获得 WEEK() 工作所需的偏移量:

SET @client := 'client2';

-- in my example I just picked the first date the client had an entry
SELECT @weekday := DAYOFWEEK(min(time)) - 1 -- need 0 to 6
  FROM clientdates
 WHERE client = @client;

SELECT client,
       @weekday,
       YEAR(time) AS year,
       WEEK(time - INTERVAL @weekday DAY) AS week_offset,
       count(*)
  FROM clientdates
 WHERE client = @client
 GROUP BY client, year, week_offset

运行 它与此数据,这将是星期四的第一天:

INSERT INTO clientdates
  VALUES ('client2', '2021-08-19 04:14:07.9'),
         ('client2', '2021-08-20 04:14:07.9'),
         ('client2', '2021-08-21 04:14:07.9'),
         ('client2', '2021-08-22 04:14:07.9'),
         ('client2', '2021-08-23 04:14:07.9'),
         ('client2', '2021-08-24 04:14:07.9'),
         ('client2', '2021-08-25 04:14:07.9'),
         ('client2', '2021-08-26 04:14:07.9'),
         ('client2', '2021-08-27 04:14:07.9'),
         ('client2', '2021-08-28 04:14:07.9'),
         ('client2', '2021-08-29 04:14:07.9');

我得到这个结果:

client @weekday year week_offset count(*)
client2 2 2021 33 7
client2 2 2021 34 4

如果您需要使用 WEEK(time, 1),则在获取 @weekday 的值时只需减去 2 而不是 1,因为您需要星期一才能获得零索引值而不是星期天。


dbfiddle