0
votes

Date TSQL Min et Max

J'ai une table avec des colonnes DateTime, JobID, TaskID

SELECT FORMAT(jbl.JobLogDateTime, 'yyyy-MM-dd') AS mainrundate, 
child.starttime, 
MAX(joblogdatetime) FROM JobLog jbl INNER JOIN 
(
SELECT FORMAT(JobLogDateTime, 'yyyy-MM-dd') AS rundate, MIN(joblogdatetime) 
AS Starttime FROM JobLog 
WHERE TaskID=456
GROUP BY FORMAT(joblogdatetime, 'yyyy-MM-dd')
) child ON child.rundate=jbl.mainrundate 
GROUP BY child.starttime, FORMAT(jbl.JobLogDateTime, 'yyyy-MM-dd')
ORDER BY FORMAT(jbl.JobLogDateTime, 'yyyy-MM-dd') desc

J'ai besoin d'écrire une requête qui me donne le min (datetime) de l'enfant taskID 456 et max (datetime) du parent jobId 353, la sortie doit ressembler à

select 
mt1.Starttime, MAX(t1.JobLogDateTime) AS Endtime
from 
JobLog t1
inner join (
    SELECT jobid, MIN(JobLogDateTime) AS Starttime
    FROM JobLog WHERE taskid=456
    group by JobLogDateTime, jobid

) mt1
    on t1.JobID=mt1.jobid
    GROUP BY t1.JobLogDateTime

C'est pour juste un jour, c'est-à-dire le 16, de même j'ai besoin de données d'une semaine. J'ai essayé de faire une jointure sur la même table

Startime                     Endtime
2020-05-16 06:43:12.297      2020-05-16 06:50:11:112

Cela crée un problème en raison d'une clause group by incorrect, j'ai également essayé:

DateTime                 JobID            TaskID
2020-05-16 06:43:11.687   353              NULL
2020-05-16 06:45:11.687   353              123
2020-05-16 06:43:11.687   353              123
2020-05-16 06:43:12.297   353              456
2020-05-16 06:44:30.750   353              456
2020-05-16 06:44:30.750   353              456
2020-05-16 06:44:30.750   353              789
2020-05-16 06:45:05.000   353              789
2020-05-16 06:48:07.750   353              789
2020-05-16 06:49:01:110   353              011
2020-05-16 06:50:11:112   353              NULL

mais il dit que la jointure est incorrecte


1 commentaires

N'utilisez pas FORMAT() pour ce style . Utilisez CONVERT(char(10), col_name, 120) . Pour le regroupement et la commande, je préférerais même CONVERT(date, col_name) .


4 Réponses :


-1
votes
SELECT 
    min( datetime ) OVER ( task_id )
    , max( datetime ) OVER ( task_id )
FROM 
    X
WHERE 
    job_id = y

0 commentaires

0
votes

Je pense que vous devez également regrouper par jobid dans la requête principale, puis ajouter le groupe par le champ de la sous-requête, t1.JobLogDateTime est le champ que vous agrégez, pas celui que vous groupez, même chose dans la sous-requête, si vous faites MIN (X) vous ne pouvez pas également GRUOP BY X. Essayez d'utiliser ceci:

select 
t1.jobid, mt1.Starttime, MAX(t1.JobLogDateTime) AS Endtime
from 
JobLog t1
inner join (
    SELECT jobid, MIN(JobLogDateTime) AS Starttime
    FROM JobLog WHERE taskid=456
    group by jobid
) mt1
    on t1.JobID=mt1.jobid      
    GROUP BY t1.jobid, mt1.StartTime

J'ai également supprimé le point à la fin de 't1.JobID = mt1.jobid', je pense que c'est une faute de frappe

EDIT: quelques modifications .. mon premier message et le format n'était pas très agréable :)


0 commentaires

0
votes

Essaye ça

WITH child
     AS (SELECT taskid, 
                MIN(JobLogDateTime) AS Endtime
         FROM JobLog
         WHERE taskid = 456
         GROUP BY taskid)

SELECT MAX(j.JobLogDateTime) AS Startime, 
    MIN(c.Endtime) AS Endtime
FROM JobLog AS j
JOIN child AS c ON j.TaskID = c.TaskID;


2 commentaires

Cela pourrait fonctionner si des données étaient nécessaires pendant un jour, mais je recherche des heures de début et de fin pendant une semaine


ajoutez simplement les filtres "JobLogDateTime entre <date de début de recherche> et <date de recherche de fin>" à la clause WHERE dans les deux instructions SELECT



0
votes

J'ai pu résoudre ce problème en modifiant ma requête comme ci-dessous:

SELECT FORMAT(jbl.JobLogDateTime, 'yyyy-MM-dd') AS JobRunDate, MIN(child.starttime) 
AS Startime, MAX(jbl.joblogdatetime) AS EndTime
FROM JobLog jbl left JOIN 
(
SELECT  joblogdatetime AS Starttime FROM JobLog 
WHERE TaskID=456
) child ON child.Starttime=jbl.JobLogDateTime
WHERE jobid=353 
GROUP BY FORMAT(jbl.JobLogDateTime, 'yyyy-MM-dd')
ORDER BY FORMAT(jbl.JobLogDateTime, 'yyyy-MM-dd') desc


0 commentaires