2010-08-31 41 views
0

在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點)。創建頁面包含小時,分鐘和am/pm下拉菜單以及結束小時的3個下拉菜單。我想要做的是激發一個ajax腳本,當下拉菜單選擇發生變化時查找重疊條目。如果它發現一個它會觸發一個js警報。

你會如何在SQL中檢測到這種重疊?

任何想法都將大受歡迎。

非常感謝, 保羅

+0

你的問題是關於SQL,與經典的ASP無關,你可以重新標記和編輯你的問題,刪除不相關的部分? – Oded 2010-08-31 12:59:49

+0

我已經相應地更改了標籤。我很抱歉。 – neojakey 2010-08-31 17:51:03

回答

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 

如果任何更多選擇記錄存在重疊

編輯:我糾正了聲明。它現在應該工作。

+0

SELECT * FROM程序WHERE (ProgramStart <=「1900- (ProgramStart <='1900-01-01 17:00:00.000''和ProgramEnd <='1900'),並且程序結束> ='1900-01-01 18:00:00:00')或 (ProgramStart> ='1900-01-01 17:00:00.000'和ProgramEnd> ='1900-01-01 18:00:00.000')或 (ProgramStart >'1900-01-01 17:00:00'和ProgramEnd <'1900-01-01 18:00:00:00')服務器並且它返回了所有記錄,即使它應該返回0。數據庫中的3條記錄是:上午9點至11點,上午11點至下午1點,下午1點至4點我仍然處於虧損狀態。請幫助 – neojakey 2010-08-31 17:48:59

+0

啊。有一點霧氣。確保time_from始終在time_to之前。如果您允許約會的反向定義,則該聲明將不起作用。 – 2010-09-02 04:26:03

0

你可以做一個選擇,看看日期在任何範圍內進入瀑布:

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

如果返回TCOUNT爲> = 1,則存在重疊。另外,你的程序長度不應該真的存儲在數據庫中,因爲它是技術上重複的數據,每次你改變程序時間都需要更新,我會建議這個值可以在需要時提取(使用SQL dateDiff()例如)。

+0

SELECT COUNT(1)as tCount FROM Programs WHERE ProgramStart <='1900-01-01 17:00:00.000'AND ProgramEnd <='1900-01-01 18:00:00.000' 我跑了t-sql上面的腳本在服務器上,它返回所有三個記錄,即使它不應該返回任何東西。 3條記錄在數據庫是: 上午9時至11時上午11點 下午1點到下午1點 下午4 我仍處於虧損狀態。請幫助 – neojakey 2010-08-31 17:45:02

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;" 

謝謝所有您的建議相結合和研究給我帶來了這個解決方案的時候。