我有一个名为task
id t_title t_started_on t_due_on
1 Test 1 2018-01-18 01:00 PM 2018-01-20 01:00 PM
2 Test 2 2018-01-25 01:00 PM 2018-01-27 01:00 PM
从这里我必须选择日期,如第一行开始日期是2018-01-18 01:00 PM(t_started_on
),结束日期是2018-01-20 01:00 PM({{1} })。总共3天
与第二行相同,也是3天
预期结果
t_due_on
如何在上述情况下编写选择查询?
答案 0 :(得分:0)
就像我在your previous question中所说的那样,你应该不将日期存储为字符串,而是date
数据类型:这将使您的数据不易出错,查询更简单。现在,每当您需要使用它们进行日期/时间计算时,您必须将这些字符串转换为日期。
要生成句点内的日期,您需要一个帮助程序表,这对于许多其他目的也很有用:一个表有一个自然数从0开始到一些大 n 的列。您可以像这样创建它:
create table nums (i int);
insert into nums values (0), (1), (2), (3);
insert into nums select i+4 from nums;
insert into nums select i+8 from nums;
insert into nums select i+16 from nums;
insert into nums select i+32 from nums;
insert into nums select i+64 from nums;
insert into nums select i+128 from nums;
insert into nums select i+256 from nums;
您可以通过添加类似的插入语句来查看如何将记录数量加倍,但这已经生成了512条记录,这对于您的目的来说已经足够了:它应该具有一段时间可以达到的最大天数在你的任务表中。
然后您可以使用此查询来获得所需的输出:
SELECT DISTINCT date_add(d_started_on, interval i day)
FROM (
SELECT date(STR_TO_DATE(t_started_on, '%Y-%m-%d')) as d_started_on,
datediff(
date(STR_TO_DATE(t_due_on, '%Y-%m-%d')),
date(STR_TO_DATE(t_started_on, '%Y-%m-%d'))
) as days
FROM tasks
) as base
INNER JOIN nums ON i <= days
ORDER BY 1