防止重叠的约会时间

时间:2010-08-31 12:54:56

标签: sql sql-server-2005

我在SQL-Server 2005和Classic ASP中遇到了一个令人困惑的小问题。我在数据库中有以下表格

+-----------+----------+----------+--------------+-------------------------+-------------------------+--------------+
| ProgramID | SystemID | ClientID | ProgramName  | ProgramStart            | ProgramEnd              | ProgramHours |
+-----------+----------+----------+--------------+-------------------------+-------------------------+--------------+
| 22        | 18       | 4        | After Gym    | 1900-01-01 09:00:00.000 | 1900-01-01 11:00:00.000 | 2hrs 0mins   |
| 23        | 18       | 4        | Free Weights | 1900-01-01 12:00:00.000 | 1900-01-01 14:00:00.000 | 2hrs 0mins   |
+-----------+----------+----------+--------------+-------------------------+-------------------------+--------------+

这基本上显示了在特定时间段内分配给系统和客户端的程序。我想要做的是阻止用户输入与已经使用的时间重叠的第三个程序(例如上午10点到11点)。创建页面包含开始时间的小时,分​​钟和上午/下午的下拉菜单以及结束时间的3个下拉菜单。我想要做的是激活一个ajax脚本,当下拉菜单选择发生变化时,该脚本会查找重叠的条目。如果它找到一个它会发出一个js警报。

如何在SQL中检测到这种重叠?

任何想法都会受到极大的欢迎。

非常感谢, 保罗

3 个答案:

答案 0 :(得分:1)

SELECT * FROM appointments WHERE 
(time_from <= $from and time_to >= $to) or // determine if the new appointment is fully in an exitent
(time_from <= $from and $from < time_to and time_to <= $to) or // determine if the new appointment starts in an existing and ends after
(time_from >= $from and time_to >= $to and $to > time_from) or // determine if the new appointment starts before an existing and ends in
(time_from > $from and time_to < $to) // determine if the new appointment starts before and ends after

如果选择了更多记录,则存在重叠

编辑:我更正了声明。现在应该可以了。

答案 1 :(得分:0)

您可以选择查看输入的日期是否属于任何范围:

SELECT COUNT(1) as tCount FROM TABLE WHERE programStart <= formDate AND programEnd  <= formDate

如果它将tCount返回为&gt; = 1则会出现重叠。

此外,您的程序长度不应该真正存储在数据库中,因为它是技术上重复的数据,每次更改程序时都需要更新,我建议可以在需要时提取它的值(使用SQL例如dateDiff())。

答案 2 :(得分:0)

我终于用以下SQL语句解决了这个问题:

SELECT COUNT(*) AS Program_Count FROM Programs
WHERE ('1900-01-01 10:00:01.000' BETWEEN ProgramStart AND ProgramEnd)
OR ('1900-01-01 10:59:59.000' BETWEEN ProgramStart   AND ProgramEnd)
OR (ProgramStart BETWEEN '1900-01-01 10:00:01.000' AND '1900-01-01 10:59:59.000')
OR (ProgramEnd BETWEEN '1900-01-01 10:00:01.000' AND '1900-01-01 10:59:59.000')
AND SystemID = 18;"

感谢您提出的所有建议,在结合和研究时为我提供了这个解决方案。