日期验证

nr9pn0ug  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(12767)

我需要检查每个项目的步骤是在项目的开始和结束日期之间完成的(编写一个查询,让人知道是否是这种情况)
这是我的密码:

SELECT e.idetape,
       e.idprojet,
       e.datedebut,
       e.datefin
FROM   (SELECT idprojet,
               datedebut,
               datefin
        FROM   projet) AS p
       LEFT JOIN etapexprojet AS e
              ON e.datedebut < p.datedebut
                 AND e.datefin < p.datefin
ORDER  BY idprojet;

etapexprojet表(etapexprojet表中还有其他日期):

+---------+----------+-------------+--------------+--+
| idEtape | idProjet |  dateDebut  |   dateFin    |  |
+---------+----------+-------------+--------------+--+
|       1 |        1 | 2011-07-01  | 2011-09-01   |  |
|       1 |        2 | 2012-05-01  |  2012-05-10  |  |
|       1 |        3 | 2011-11-01  |  2012-01-20  |  |
|       2 |        1 |             |              |  |
|       2 |        2 |             |              |  |
|       2 |        3 |             |              |  |
|       3 |        1 |             |              |  |
|       3 |        2 |             |              |  |
|       3 |        3 |             |              |  |
|       4 |        1 |             |              |  |
|       4 |        2 |             |              |  |
|       5 |        2 |             |              |  |
+---------+----------+-------------+--------------+--+

项目表:

+----------+----------+-----------+------------+------------+---------------+--+
| idProjet | idClient | nomProjet | dateDebut  |  dateFin   | idResponsable |  |
+----------+----------+-----------+------------+------------+---------------+--+
|        1 |      321 | Devl.     | 2011-08-01 |            |          1876 |  |
|        2 |      321 | Maint.    | 2012-05-01 | 2012-07-23 |          2231 |  |
|        3 |      345 | Devl.2    | 2011-11-01 |            |          2231 |  |
+----------+----------+-----------+------------+------------+---------------+--+

我的预期结果是检查/验证每个idetape的开始日期和结束日期是否在相关项目的开始日期和结束日期之间。

pgx2nnw8

pgx2nnw81#

您不需要使用派生表(sub-select查询),因为您不需要在 projet table。
我相信你只关心 idetape 位于 projetdatedebut 以及 datefin .
你可以改变 Left JoinInner Join 基于上述观点。
我还增加了要检查的案件的范围,因为有可能 datefin 存在 NULL 在任何一张table上。
请尝试以下操作:

SELECT e.idetape,
       e.idprojet,
       e.datedebut,
       e.datefin,
       p.datedebut AS projet_datedebut,
       p.datefin   AS projet_datefin
FROM   EtapexProjet AS e
       JOIN Projet AS p
         ON p.idprojet = e.idprojet
            AND e.datedebut >= p.datedebut 
            AND (e.datefin <= p.datefin OR 
                 p.datefin IS NULL OR 
                 e.datefin IS NULL
                )
ORDER  BY e.idprojet, 
          e.idetape;
7jmck4yq

7jmck4yq2#

请尝试以下代码:

SELECT nomEtape, livrable, idEtape, idProjet 
FROM Etape 
WHERE idEtape= (SELECT MAX(idEtape) 
                FROM EtapexProjet 
                WHERE DISTINCT(idProjet)
               );

相关问题