在 MYSQL 的 select 语句中显示从开始日期到 end_date 的日期范围
To display range of date from start date and end_date in select statement of MYSQL
从transactional_detail中选择*;
transaction_id product_id customer_id start_date end_date
1 1 1 30-12-2014 01-01-2015
需要按以下格式输出:
transaction_id product_id customer_id date
1 1 1 30-12-2014
1 1 1 31-12-2014
1 1 1 01-01-2015
请在MYSQL中提供SQL查询。
此致,
阿伦
$startDate = date("d-m-Y",strtotime($row['start_date']));
为了 return 指定的结果集,您需要一个可以连接到 table 的行源,以生成 "duplicate" 行。
一种方法是创建日历类型 table 并使用您想要 return:
的所有可能日期的列表来填充
CREATE TABLE cal (dt DATE NOT NULL PRIMARY KEY) ENGINE=InnoDB;
INSERT INTO cal (dt) VALUES ('2010-01-01');
INSERT INTO cal (dt) SELECT dt + INTERVAL 1 DAY FROM cal ORDER BY dt;
INSERT INTO cal (dt) SELECT dt + INTERVAL 2 DAY FROM cal ORDER BY dt;
INSERT INTO cal (dt) SELECT dt + INTERVAL 4 DAY FROM cal ORDER BY dt;
INSERT INTO cal (dt) SELECT dt + INTERVAL 8 DAY FROM cal ORDER BY dt;
INSERT INTO cal (dt) SELECT dt + INTERVAL 16 DAY FROM cal ORDER BY dt;
INSERT INTO cal (dt) SELECT dt + INTERVAL 32 DAY FROM cal ORDER BY dt;
INSERT INTO cal (dt) SELECT dt + INTERVAL 64 DAY FROM cal ORDER BY dt;
INSERT INTO cal (dt) SELECT dt + INTERVAL 128 DAY FROM cal ORDER BY dt;
INSERT INTO cal (dt) SELECT dt + INTERVAL 256 DAY FROM cal ORDER BY dt;
INSERT INTO cal (dt) SELECT dt + INTERVAL 512 DAY FROM cal ORDER BY dt;
INSERT INTO cal (dt) SELECT dt + INTERVAL 1024 DAY FROM cal ORDER BY dt;
INSERT INTO cal (dt) SELECT dt + INTERVAL 2048 DAY FROM cal ORDER BY dt;
INSERT INTO cal (dt) SELECT dt + INTERVAL 4096 DAY FROM cal ORDER BY dt;
然后,在连接操作中引用table,得到"match".
的所有dt
值
假设 start_date
和 end_date
列是 DATE 数据类型:
SELECT t.transaction_id
, t.product_id
, t.customer_id
, c.dt
FROM transactional_detail t
JOIN cal c
ON c.dt >= t.start_date
AND c.dt <= t.end_date
ORDER
BY t.transaction_id
, t.product_id
, t.customer_id
, c.dt
如果 start_date
和 end_date
是 VARCHAR 而不是 DATE(这将是一个非常糟糕的设计选择),您需要将它们转换为 DATE 数据类型以获得日期比较语义,例如
ON c.dt >= STR_TO_DATE(t.start_date,'%d-%m-%Y')
AND c.dt <= STR_TO_DATE(t.end_date,'%d-%m-%Y')
从transactional_detail中选择*;
transaction_id product_id customer_id start_date end_date
1 1 1 30-12-2014 01-01-2015
需要按以下格式输出:
transaction_id product_id customer_id date
1 1 1 30-12-2014
1 1 1 31-12-2014
1 1 1 01-01-2015
请在MYSQL中提供SQL查询。
此致, 阿伦
$startDate = date("d-m-Y",strtotime($row['start_date']));
为了 return 指定的结果集,您需要一个可以连接到 table 的行源,以生成 "duplicate" 行。
一种方法是创建日历类型 table 并使用您想要 return:
的所有可能日期的列表来填充CREATE TABLE cal (dt DATE NOT NULL PRIMARY KEY) ENGINE=InnoDB;
INSERT INTO cal (dt) VALUES ('2010-01-01');
INSERT INTO cal (dt) SELECT dt + INTERVAL 1 DAY FROM cal ORDER BY dt;
INSERT INTO cal (dt) SELECT dt + INTERVAL 2 DAY FROM cal ORDER BY dt;
INSERT INTO cal (dt) SELECT dt + INTERVAL 4 DAY FROM cal ORDER BY dt;
INSERT INTO cal (dt) SELECT dt + INTERVAL 8 DAY FROM cal ORDER BY dt;
INSERT INTO cal (dt) SELECT dt + INTERVAL 16 DAY FROM cal ORDER BY dt;
INSERT INTO cal (dt) SELECT dt + INTERVAL 32 DAY FROM cal ORDER BY dt;
INSERT INTO cal (dt) SELECT dt + INTERVAL 64 DAY FROM cal ORDER BY dt;
INSERT INTO cal (dt) SELECT dt + INTERVAL 128 DAY FROM cal ORDER BY dt;
INSERT INTO cal (dt) SELECT dt + INTERVAL 256 DAY FROM cal ORDER BY dt;
INSERT INTO cal (dt) SELECT dt + INTERVAL 512 DAY FROM cal ORDER BY dt;
INSERT INTO cal (dt) SELECT dt + INTERVAL 1024 DAY FROM cal ORDER BY dt;
INSERT INTO cal (dt) SELECT dt + INTERVAL 2048 DAY FROM cal ORDER BY dt;
INSERT INTO cal (dt) SELECT dt + INTERVAL 4096 DAY FROM cal ORDER BY dt;
然后,在连接操作中引用table,得到"match".
的所有dt
值
假设 start_date
和 end_date
列是 DATE 数据类型:
SELECT t.transaction_id
, t.product_id
, t.customer_id
, c.dt
FROM transactional_detail t
JOIN cal c
ON c.dt >= t.start_date
AND c.dt <= t.end_date
ORDER
BY t.transaction_id
, t.product_id
, t.customer_id
, c.dt
如果 start_date
和 end_date
是 VARCHAR 而不是 DATE(这将是一个非常糟糕的设计选择),您需要将它们转换为 DATE 数据类型以获得日期比较语义,例如
ON c.dt >= STR_TO_DATE(t.start_date,'%d-%m-%Y')
AND c.dt <= STR_TO_DATE(t.end_date,'%d-%m-%Y')