1
我有一個項目可以根據從考勤機導入的考勤日誌計算工作小時。我使用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-01與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 2014-10-18 12:47:55
謝謝CL,WHERE子句是我問題的原因:) – Andy 2014-10-19 03:40:55
不幸的是,仍然存在一個問題,如果與其他員工匹配,那麼該日期的值將不會顯示。例如,如果2014年10月3日IDEmployee 10002不存在,則IDEmployee 10001的查詢將不會有2014-10-03行。 – Andy 2014-10-19 06:24:41