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_at
的 DAYOFWEEK("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,因为您需要星期一才能获得零索引值而不是星期天。
使用 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_at
的 DAYOFWEEK("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,因为您需要星期一才能获得零索引值而不是星期天。