MySQL:为什么日期差异总是0?

标签 mysql

我正在练习我的 SQL 技能,这是我正在练习的一个问题: https://www.hackerrank.com/challenges/projects

问题是:

You are given a table, Projects, containing three columns: Task_ID, Start_Date and End_Date. It is guaranteed that the difference between the End_Date and the Start_Date is equal to 1 day for each row in the table. If the End_Date of the tasks are consecutive, then they are part of the same project. Samantha is interested in finding the total number of different projects completed.

Write a query to output the start and end dates of projects listed by the number of days it took to complete the project in ascending order. If there is more than one project that have the same number of completion days, then order by the start date of the project.

我的逻辑是,我将按开始日期对所有内容进行排序,然后为每一行分配排名。如果当前结束日期与上一个结束日期连续,也就是 datediff(end_date, @e) = 1,那么我将保持相同的排名数字,否则我会将排名递增 1。所以基本上所有的行都属于同一个项目会有相同的排名。

下面是我的代码:

set @r := 0;
select min(start_date), max(end_date)
from (select start_date, end_date, 
      @r := if(datediff(end_date, @e) = 1, @r, @r+1) ranking,
      @e := end_date
      from projects
      order by start_date
     ) b
group by ranking
order by datediff(max(end_date), min(start_date)), 1
;

但是这段代码不起作用。

更新

根据 Sasha Pachev 的回答进行更改后,当我尝试检查子查询时:

set @r = 0;
select start_date, end_date, 
@e := end_date, datediff(end_date, date(@e)),
@r := if(datediff(end_date, date(@e)), @r, @r+1) ranking
from projects
order by start_date
;

我注意到我所有的日期差异都是 0:

2015-10-01 2015-10-02 2015-10-02 0 1 
2015-10-02 2015-10-03 2015-10-03 0 2 
2015-10-03 2015-10-04 2015-10-04 0 3 
2015-10-04 2015-10-05 2015-10-05 0 4 
2015-10-11 2015-10-12 2015-10-12 0 5 
2015-10-12 2015-10-13 2015-10-13 0 6 
2015-10-15 2015-10-16 2015-10-16 0 7 
2015-10-17 2015-10-18 2015-10-18 0 8 
2015-10-19 2015-10-20 2015-10-20 0 9 

我明白为什么,因为我在分配排名@r 之前分配了@e 作为结束日期。但是,如果我在@r 之后分配@e,它就不起作用,因为我需要@e 为diffdate() 函数赋值。 有人可以帮我打破这个循环吗?

最佳答案

SELECT         START_DATE, MIN(END_DATE) AS [END_DATE]
    FROM       (
                    (SELECT         START_DATE 
                            FROM    PROJECTS 
                            WHERE   START_DATE NOT IN (SELECT END_DATE FROM PROJECTS)
                    ) A
                    CROSS JOIN
                    (SELECT        END_DATE 
                            FROM   PROJECTS 
                            WHERE  END_DATE NOT IN (SELECT START_DATE FROM PROJECTS)
                    ) B
               )     
    WHERE      START_DATE < END_DATE
    GROUP BY   START_DATE
    ORDER BY   DATEDIFF(DAY, MIN(END_DATE), START_DATE) DESC, CAST(START_DATE AS DATE) ASC

关于MySQL:为什么日期差异总是0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41335541/

相关文章:

php - 如何使用 PHP 下载 2 个表格到 Excel 工作表

java - 如何将自动递增的 ID 值检索到 JLabel

python - 更新 tondb 连接时区而不生成新连接

PHP/MySQL - 带有各种 ORDER BY 子句的分页

Python 字典和使用 pymysql 的参数化 MySQL(安全编码)

php - 如何在 PHP 中使用 PDO 获取结果数组?

PHP-MYSQL : Does not recognize data in table

mysql - 添加 MySQL 连接器后 Glassfish keystore 错误

mysql - SQL - 提高性能

php - "latin1"DB 的 Laravel 编码问题