SQL: 我如何获得客户注册后两周的下一个星期一?
SQL: How Do i get the following Monday, 2 weeks after the customer registered with us?
我有一个在不同日期注册的客户列表,我想知道如何找到注册后 2 周后的下一个星期一?
例如,如果一个人在周日注册,那么下周一在技术上将是他们注册后的第二周和 1 天。而在下周一注册的人在技术上会在注册后的第 3 周落下。
星期一是一周的第 2 天,因此您应该将 14+2 - your_dayoftheweek 天添加到您的日期
SELECT DATE_ADD(your_date, INTERVAL (16 - DAYOFWEEK(your_date)) DAY);
或按照 barmar
的建议
SELECT case when DAYOFWEEK(your_date) = 2
then DATE_ADD(your_date, INTERVAL 21 DAY)
else DATE_ADD(your_date, INTERVAL (16 - DAYOFWEEK(your_date)) DAY)
END ;
scaisEdge 很接近,但还不够。星期日,增加的间隔是15天,实际上是3个星期一之后。下面的代码将为您提供所需的信息:
SELECT (your_date + INTERVAL ((CASE WHEN dayofweek(your_date) = 1 THEN 7 ELSE 14 END) + (2 - dayofweek(your_date))) DAY) AS 2_mondays_from_now;
由于星期日是一周中唯一比星期一小的一天,因此您需要这种大小写逻辑。这适用于一周中以数字形式出现在您想要的星期几之前的任何一天(例如,如果您想要星期三,则必须考虑星期日、星期一和星期二)
编辑
我在 MySQL 中编写了一个函数,将此问题推广到一周中的任何一天,以及输入日期之后(或之前)的任意周数:
CREATE FUNCTION dow_in_x_wks (indate DATE, dow INT, wks INT)
RETURNS DATE DETERMINISTIC
RETURN (indate + INTERVAL (
(CASE WHEN dayofweek(indate) < dow THEN (wks - 1) * 7 ELSE wks * 7 END) + (dow - dayofweek(indate))) DAY);
我有一个在不同日期注册的客户列表,我想知道如何找到注册后 2 周后的下一个星期一?
例如,如果一个人在周日注册,那么下周一在技术上将是他们注册后的第二周和 1 天。而在下周一注册的人在技术上会在注册后的第 3 周落下。
星期一是一周的第 2 天,因此您应该将 14+2 - your_dayoftheweek 天添加到您的日期
SELECT DATE_ADD(your_date, INTERVAL (16 - DAYOFWEEK(your_date)) DAY);
或按照 barmar
的建议SELECT case when DAYOFWEEK(your_date) = 2
then DATE_ADD(your_date, INTERVAL 21 DAY)
else DATE_ADD(your_date, INTERVAL (16 - DAYOFWEEK(your_date)) DAY)
END ;
scaisEdge 很接近,但还不够。星期日,增加的间隔是15天,实际上是3个星期一之后。下面的代码将为您提供所需的信息:
SELECT (your_date + INTERVAL ((CASE WHEN dayofweek(your_date) = 1 THEN 7 ELSE 14 END) + (2 - dayofweek(your_date))) DAY) AS 2_mondays_from_now;
由于星期日是一周中唯一比星期一小的一天,因此您需要这种大小写逻辑。这适用于一周中以数字形式出现在您想要的星期几之前的任何一天(例如,如果您想要星期三,则必须考虑星期日、星期一和星期二)
编辑
我在 MySQL 中编写了一个函数,将此问题推广到一周中的任何一天,以及输入日期之后(或之前)的任意周数:
CREATE FUNCTION dow_in_x_wks (indate DATE, dow INT, wks INT)
RETURNS DATE DETERMINISTIC
RETURN (indate + INTERVAL (
(CASE WHEN dayofweek(indate) < dow THEN (wks - 1) * 7 ELSE wks * 7 END) + (dow - dayofweek(indate))) DAY);