2014-10-18 64 views
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 

回答

0

要獲得行NULL值不匹配,你需要一個outer join。 而且你必須注意不要過濾掉那些不符合NULL值的WHERE子句;讓不符合條件的日期,你必須把條件爲聯接的ON子句:

SELECT ... 
FROM (...) AS X 
LEFT JOIN CheckLogs AS C ON C.Dates = X.Dates AND 
          C.IDEmployee = '10001' 
+0

對不起,我貼錯了查詢,我已經更新了正確的查詢。我已經使用了LEFT JOIN,但結果沒有NULL值。謝謝 – Andy 2014-10-18 12:47:55

+0

謝謝CL,WHERE子句是我問題的原因:) – Andy 2014-10-19 03:40:55

+0

不幸的是,仍然存在一個問題,如果與其他員工匹配,那麼該日期的值將不會顯示。例如,如果2014年10月3日IDEmployee 10002不存在,則IDEmployee 10001的查詢將不會有2014-10-03行。 – Andy 2014-10-19 06:24:41