출석 기계에서 가져온 출근 로그에서 근무 시간을 계산하는 프로젝트가 있습니다. SQLite 데이터베이스와 VB .NET을 사용합니다.일치하는 행이없는 시간 동안 출석 목록 생성
CREATE TABLE [CheckLogs] (
[IDCheckLog] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
[IDEmployee] TEXT NOT NULL,
[Dates] TEXT NOT NULL,
[In] TEXT,
[Out] TEXT,
[OverTime] NUMERIC DEFAULT 0);
CREATE TABLE integers (i INTEGER NOT NULL PRIMARY KEY);
INSERT INTO integers (i) VALUES
(0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
표 CheckLogs 내가 출석 시스템에서 가져 오는 데이터입니다 :
먼저 나는 내가 사용하는 테이블을 보여 드리겠습니다. OverTime 열은 내 프로그램에서 계산됩니다. 테이블 정수는 날짜 목록을 만드는 데 사용됩니다. here에서 가져 왔습니다.
두 날짜 사이에 직원 출석을 표시하는보기를 생성하고 직원이있는 경우 CheckLogs 데이터를 표시하고 부재중 인 경우 null을 표시하려고합니다. CheckLogs 테이블에서 직원이 부재 한 경우이 직원의 해당 날짜의 데이터가 없기 때문입니다.
이
내가 원하는이다 (이 2014년 10월 1일와 2014년 10월 5일 사이에 직원 10001에 대한 보고서입니다) :Dates | IDEmployee | In | Out
---------------------------------------
2014-10-01 | 10001 | 07:00 | 16:00
2014-10-02 | 10001 | 07:01 | 15:58
2014-10-03 | 10001 | null | null
2014-10-04 | 10001 | 07:08 | 15:48
2014-10-05 | 10001 | null | null
그리고 이것은 내가 지금 가지고있는 쿼리입니다 :
이 쿼리에서SELECT X.[Dates], C.[IDEmployee], C.[In], C.[Out]
FROM
(select date('2014-10-01', '+' || (H.i*100 + T.i*10 + U.i) || ' day') as Dates
from integers as H
cross
join integers as T
cross
join integers as U
where date('2005-01-25', '+' || (H.i*100 + T.i*10 + U.i) || ' day') <= '2014-10-05') AS X
, CheckLogs AS C USING (Dates)
WHERE C.[IDEmployee]='10001'
나는이 결과가 있습니다
Dates | IDEmployee | In | Out
---------------------------------------
2014-10-01 | 10001 | 07:00 | 16:00
2014-10-02 | 10001 | 07:01 | 15:58
2014-10-04 | 10001 | 07:08 | 15:48
내가, 내가 잘못된 쿼리를 유감 붙여있어, 내가 올바른 쿼리를 업데이트했습니다. 이미 LEFT JOIN을 사용하고 있지만 결과에 NULL 값이 없습니다. 감사합니다 – Andy
CL, WHERE 절이 내 문제의 원인입니다. 감사합니다. – Andy
불행히도 여전히 문제가 있습니다. 다른 직원과 일치하는 항목이 있으면 해당 날짜의 값이 표시되지 않습니다. 예를 들어 2014-10-03에 IDEmployee 10002가 없으면 IDEmployee 10001에 대한 쿼리에 2014-10-03 행이 없습니다. – Andy