2012-05-09 65 views
1

簡介:我有表一個數據庫,其中包含小時柱,例如SQL語句,從數小時特定範圍中選擇數據

08:30:00 
08:45:00 
09:30:00 
12:20:00 
... 
18:00:00 

在此列中的數據類型是「時間」。 問題:是否可以使用SQL來選擇所有小時[例如, 10:00:00,10:30:00,11:00:00等]從08:00:00到18:00:00不在列表中?

編輯: 那麼,想一想,解決方案你[謝謝! ]並不完全完美[它完美的細節我給你:)]。我的應用程序允許用戶進行約半小時的約會[在此版本的應用程序中]。在我的第一個主題中,我給你的時間列是相當樂觀的,因爲我沒有舉行例如11:45:00或13:05:00等小時的封面會議,會在12:15:00和13點結束:35:00,所以我真的不知道從哪個小時我可以放在這張額外的桌子上。

回答

1

首先,創建一個表T_REF,其列COL_HR的日期爲 如果原始表中未找到要報告的所有小時數。

在MySQL做這樣的事情應該工作

SELECT DATE_FORMAT(COLUMN_NAME, '%H') FROM T_REF 
MINUS 
SELECT DATE_FORMAT(COLUMN_NAME, '%H') FROM ORIG_TABLE 

這將讓和只比較小時,並報告不在 在表(ORIG_TABLE)中的那些。

0

你只希望找到每個小時和半小時?不知道你期望找到或找不到的時間,我會建議如下:

創建一個單獨的表,其中包含所有可能的時間,然後運行查詢以查找哪些時間不存在於原始表。

1

醜,但有可能:

CREATE TABLE thours (h time); 
INSERT INTO thours VALUES 
    ('08:30:00'), ('08:45:00'), ('09:30:00'), 
    ('12:20:00'), ('18:00:00'); 

CREATE VIEW hrange AS 
SELECT 8 as h UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL 
SELECT 11  UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL 
SELECT 14  UNION ALL SELECT 15 UNION ALL SELECT 16 UNION ALL 
SELECT 17  UNION ALL SELECT 18; 

CREATE VIEW hours AS 
SELECT cast(concat(cast(h as char), ':00:00') as time) AS h FROM hrange 
UNION ALL 
SELECT cast(concat(cast(h as char), ':30:00') as time) 
    FROM hrange WHERE h < 18 
ORDER BY 1; 

SELECT h.h AS ranged, t.h AS scheduled 
    FROM hours h 
    LEFT join thours t ON h.h = t.h; 

如果將添加WHERE t.h IS NULL到查詢,你會得到的通緝小時的列表。

我創建視圖爲MySQL不能動態生成系列。 Try out here