2017-12-29 15 views
2

サンプルデータがQUERY FROM/WANTED結果がHAVING&クエリBETWEEN


ジェシカ・ドウ以外のすべてのエントリが表示されるべき期待

INSERT INTO `employee` (id, first_name, last_name) VALUES 
('1', 'john', 'doe'), 
('2', 'joan', 'doe'), 
('3', 'jeff', 'doe'), 
('4', 'george', 'doe'), 
('5', 'jessica', 'doe'), 
('6', 'james', 'doe'), 
('7', 'justin', 'doe'), 
('8', 'jody', 'doe'); 

INSERT INTO `shift` (`started_at`, `ended_at`, `employee_id`) VALUES 
('2017-11-01 08:00:00', '2017-11-01 12:00:00', 1), 
('2017-11-01 12:00:00', '2017-11-01 16:00:00', 2), 
('2017-11-02 08:00:00', '2017-11-02 12:00:00', 3), 
('2017-12-25 12:00:00', '2017-12-25 16:00:00', 6), 
('2017-12-25 12:00:00', '2017-12-25 16:00:00', 3), 
('2017-12-28 19:00:00', '2017-12-28 23:00:00', 5), 
('2017-12-23 12:00:00', '2017-12-23 14:00:00', 5); 


空白値を返します。 (彼女は過去2週間のr時間で8時間を壊すのでule)

('2017-11-01 08:00:00', '2017-11-01 12:00:00', 1), 
('2017-11-01 12:00:00', '2017-11-01 16:00:00', 2), 
('2017-11-02 08:00:00', '2017-11-02 12:00:00', 3), 
('2017-12-25 12:00:00', '2017-12-25 16:00:00', 6), 
('2017-12-25 12:00:00', '2017-12-25 16:00:00', 3), 

ありがとう。

+0

SQLのフィドルはいいですが、あなたの質問を編集してサンプルデータと望みの結果を得るべきです。たとえば、最初の文からの私の期待は、あなたがトリガーを探しているということです。 –

+0

こんにちはゴードン、申し訳ありませんが、私はその要件を満たす資格があると思っていましたが、私の編集はOKですか? – entity

+0

現在、2日間の期間内に8時間に焦点を当てていますか? 2週間で8時間ではいけませんか?従業員にIDを提供できますか? – sia

答えて

0

あなたが条件

SELECT e.first_name, e.last_name, SUM(ABS(TIMESTAMPDIFF(HOUR, s.started_at, 
s.ended_at))) as shift_hours 
FROM employee e, shift s 
WHERE e.id = s.employee_id and started_at BETWEEN (NOW() - INTERVAL 2 WEEK) AND NOW() 
GROUP BY e.id 
HAVING shift_hours < 8 

HAVING句はSQLに追加された場所にWHEREキーワードは集約関数と一緒に使用することができなかったので、あなたの2weekを配置する必要があります。

+0

Kiamozありがとうございますが、まだ問題が残っています。過去2週間で8時間以上の作業をしていない従業員をすべて選択するようにしたいと思います。 最後の2週間に8時間以上の作業を完了していないデータベース上のすべての従業員を本質的に選択していますが、私は現在これを正しい方法で行っていますか? – entity

+0

あなたの希望/希望に問題があります。( '2018-01-01 08:00:00'、 '2018-01-01 12:00:00'、1)、2週間を過ぎていない、あなたが必要としているものをわたしに知らせてください。 – kiamoz

+0

ごめん、私の間違い - 私は今データを修正しました。 クエリは、実行中のクエリの過去2週間に8シフトを超えるものを除いて、すべての従業員を選択する必要があります。 データベースは、クエリ実行の直前の24時間以内に作業を完了した従業員を選択すべきではありません。 私は私の考えと正しい行にいますか?うまくいけば、私が説明していることは理にかなっています。申し訳ありませんが、私に教えてください! – entity

0

私はここでベースを離れているかもしれませんが、MySQLは私の専門ではありません。しかし... SQLfiddleでは、HAVING節(あなたの質問で最後に述べた行)を削除すると、すべてのレコードに8時間以上が表示されていることがわかります。これは、HAVING句が正しく機能していることを意味します。それは8時間以上のレコードが返されるのを防ぎます。この場合、 "HAVING shift_hours < 8"はそれがするべきことを正確に実行しています。あなたの集団の何かが、あなたが思う/期待していることをしていないようなものに見えます。

注論理比較(< 8)を行の最後に移動すると、行を削除した場合と同じ結果になります。

+0

ちょっとM C、 ありがとうございました!うん、それは正しいです、私はそれが本質的にこれを言うようにしようとしているが、私はどのように書かれているように正しく動作していると信じて "過去2週間で8時間未満で働いているすべてのエンジニアを選択"過去2週間で仕事をしている人と8時間未満の人のみを返します。私はこれをどのように達成できるか考え直すのは本当に苦労しています。もう一度、ありがとうございました! – entity