1

简介:例如,我有一个包含小时列的表的数据库

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,所以我真的不知道我可以在这个额外的桌子上放几个小时。

4

3 回答 3

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)。

于 2012-05-09T16:30:39.797 回答
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 无法动态生成系列。 在这里试试

于 2012-05-09T17:07:49.980 回答
0

您是否只希望找到每个小时和半小时?在不知道您希望找到或不找到的时间的情况下,我建议您执行以下操作:

创建一个包含所有可能时间的单独表,然后运行查询以查找原始表中不存在哪些时间。

于 2012-05-09T16:27:45.940 回答