2012-05-09 64 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