MySQL 如何将日期拆分为已知间隔并按行进行转换?
MySQL how to split a date into known intervals and transform it in rows?
如何将选定的日期值拆分为多行,例如直到现在为止的已知间隔?我可以使用 Recursive CTE 来完成,但是 MySql Aurora(RDS) 不提供支持。
例如:获取像
这样的单个结果
|--|----------|
|id|createdAt |
|--|----------|
|1 |2018-01-01|
|--|----------|
给定 7 天的间隔,查询应输出如下数据:
|----------|
|clycles |
|----------|
|2018-01-01|
|2018-01-08|
|2018-01-15|
|2018-01-22|
|... |
|----------|
我会为此使用临时 table
DELIMITER //
CREATE PROCEDURE `increment_date_till_now`(
IN `date_start` DATE,
IN `day_interval` INT
)
BEGIN
CREATE TEMPORARY TABLE `__increment_days` (`date` DATE NOT NULL);
SET @dt = date_start;
INSERT INTO `__increment_days` VALUES (@dt);
WHILE (@dt := @dt + INTERVAL day_interval DAY) < CURRENT_DATE() DO
INSERT INTO `__increment_days` VALUES (@dt);
END WHILE;
SELECT * FROM `__increment_days`;
DROP TABLE `__increment_days`;
END//
然后
CALL increment_date_till_now('2018-01-01', 7);
如果您在 d 列中有一个(可能是临时的)table 所有可能的日期,您可以
SELECT whatever, d FROM somewhere
JOIN dates
WHERE d BETWEEN createdAt AND CURRENT_DATE()
AND MOD(DATEDIFF(d, createdAt),7)=0
另见 How to populate a table with a range of dates?
如何将选定的日期值拆分为多行,例如直到现在为止的已知间隔?我可以使用 Recursive CTE 来完成,但是 MySql Aurora(RDS) 不提供支持。
例如:获取像
这样的单个结果|--|----------|
|id|createdAt |
|--|----------|
|1 |2018-01-01|
|--|----------|
给定 7 天的间隔,查询应输出如下数据:
|----------|
|clycles |
|----------|
|2018-01-01|
|2018-01-08|
|2018-01-15|
|2018-01-22|
|... |
|----------|
我会为此使用临时 table
DELIMITER //
CREATE PROCEDURE `increment_date_till_now`(
IN `date_start` DATE,
IN `day_interval` INT
)
BEGIN
CREATE TEMPORARY TABLE `__increment_days` (`date` DATE NOT NULL);
SET @dt = date_start;
INSERT INTO `__increment_days` VALUES (@dt);
WHILE (@dt := @dt + INTERVAL day_interval DAY) < CURRENT_DATE() DO
INSERT INTO `__increment_days` VALUES (@dt);
END WHILE;
SELECT * FROM `__increment_days`;
DROP TABLE `__increment_days`;
END//
然后
CALL increment_date_till_now('2018-01-01', 7);
如果您在 d 列中有一个(可能是临时的)table 所有可能的日期,您可以
SELECT whatever, d FROM somewhere
JOIN dates
WHERE d BETWEEN createdAt AND CURRENT_DATE()
AND MOD(DATEDIFF(d, createdAt),7)=0
另见 How to populate a table with a range of dates?