2017-05-01 6 views
1

こんにちは私は計算し、現在の行から次の行にdatetime列の間に費やされた時間を表示したいと思います。現在の行から次の行にdatetimeからタイムペインを取得するmysql

現在のテーブル:

task_id | task | date    | user_id 
     1 | Task 1 | 2017-04-30 08:30:23 | 35 
     2 | Task 2 | 2017-04-30 09:30:23 | 35 
     3 | Task 3 | 2017-04-30 10:00:23 | 35 

期待される結果:

task_id | task | date    | timespent 
     1 | Task 1 | 2017-04-30 08:30:23 | 60 
     2 | Task 2 | 2017-04-30 09:30:23 | 30 
     3 | Task 3 | 2017-04-30 10:00:23 | (compute it by current time) 

私はこのようなクエリを持っているが、それは私の期待される結果

SELECT A.task_id, A.date,A.task,A.user_id, 
TIMESTAMPDIFF(MINUTE,A.date,B.date) AS timespent 
FROM tbl_task A CROSS JOIN tbl_task B 
WHERE B.task_id IN (SELECT MIN(C.task_id) 
FROM tbl_task C 
WHERE C.task_id > A.task_id) 
AND A.user_id = 35 
AND Month(A.date) = 5 
ORDER BY A.task_id ASC 

上記の問題を得ることができないようですクエリは、最後の行を取得できないか、行が単なるレコードであるかどうかを調べます。私は、現在の時刻now()で最後のレコードまたは単一レコードのタイムペントを計算したいと思います。 助けてくれてありがとう。

+0

サンプル・データを生成するために、ソース・テーブルのスキーマをサンプル・データとともに表示してください。 –

+0

LEFT JOINを使用して最後の行を保持します。 –

+0

@SloanThrasherは現在のスキーマと予想される結果を追加します – Cris

答えて

1

最後の行を保持するには、LEFT JOINを使用する必要があります。 B.task_idの条件はON句に入れる必要があります。また、COALESCE(B.date, NOW())を使用すると、NULLを現在のタイムスタンプに置き換えることができます。私はまた、サブクエリのWHERE句にC.user_id = A.user_idを追加

SELECT A.task_id, A.date,A.task,A.user_id, 
TIMESTAMPDIFF(MINUTE,A.date, COALESCE(B.date, NOW())) AS timespent 
FROM tbl_task A 
LEFT JOIN tbl_task B ON B.task_id = (
    SELECT MIN(C.task_id) 
    FROM tbl_task C 
    WHERE C.user_id = A.user_id 
     AND C.task_id > A.task_id) 
WHERE A.user_id = 35 
    AND Month(A.date) = 5 
ORDER BY A.task_id ASC 

注意。そうしないと、別のユーザーのtask_idが表示されることがあります。あなただけの次の行からdateを必要とするので、あなたはGROUP BYを使用してサブクエリを回避することができます

SELECT A.*, 
    TIMESTAMPDIFF(MINUTE,A.date, COALESCE(MIN(B.date), NOW())) AS timespent 
FROM tbl_task A 
LEFT JOIN tbl_task B 
    ON B.user_id = A.user_id 
    AND B.task_id > A.task_id 
WHERE A.user_id = 35 
    AND Month(A.date) = 5 
GROUP BY A.task_id 
ORDER BY A.task_id ASC; 

デモ:http://rextester.com/SDWX89625

+0

これは私のために働いています。お返事ありがとう – Cris

1

は、外部結合を使用してください。 B.dateがNULLの場合は、代わりにNOW()を使用してください。

SELECT A.task_id 
     , A.date 
     , A.task 
     , A.user_id 
     , TIMESTAMPDIFF(MINUTE,A.date,IFNULL(B.date,NOW()) AS timespent 
--         ^^^^^^^  ^^^^^^^   
    FROM tbl_task A 
    LEFT 
-- ^^^^ 
    JOIN tbl_task B 
    ON B.task_id IN 
-- ^^ 
        (SELECT MIN(C.task_id) 
         FROM tbl_task C 
         WHERE C.task_id > A.task_id 
        ) 
    AND A.user_id = 35 
    AND MONTH(A.date) = 5 
    ORDER BY A.task_id 
1

これは動作するはずです:このような

何か

SELECT 
    a.task_id, 
    a.date, 
    a.task, 
    a.user_id, 
    TIMESTAMPDIFF(MINUTE,a.date,IF(b.date IS NULL,CURRDATE(),b.date) AS timespent 
FROM tbl_task a 
LEFT JOIN tbl_task b 
ON a.task_id > b.task_id 
WHERE a.user_id = 35 
AND month(a.date) = 5 
GROUP BY a.task_id 
ORDER BY a.task_id 

は基本的には、左の参加を使用することによって、試合のないレコードは自分の列のNULL値を持つことになります。 timespent列はnullをテストし、代わりにcurr_date()を使用します。

+0

ありがとうございます。エラーが発生しました/ * SQLエラー(1305):機能mydb.IDが存在しません – Cris

+0

おっと!タイプミスを修正しました。もう一度お試しください。 (_IF_は_ID_でした) –

+0

あなたのために働く場合は、受け入れ済みとしてマークしてください。 –

関連する問題