如何在日期之间制作单个数组

时间:2018-01-20 10:04:41

标签: php mysql sql

我有一个名为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天

  1. 2018年1月18日
  2. 2018年1月19日
  3. 二零一八年一月二十零日
  4. 与第二行相同,也是3天

    1. 2018年1月25日
    2. 2018年1月26日
    3. 2018年1月27日
    4. 预期结果

      t_due_on

      如何在上述情况下编写选择查询?

1 个答案:

答案 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

另见SQLfiddle