2016-08-11 42 views
1

我有一個關於時間的要求存儲爲字符串,如下面:SQL查詢來獲取字符串值作爲時間差

ID - FromTime - ToTime - Day - RoomNo 
     1 - 10:00 AM - 11:00 AM - Sun - 202 
     2 - 11:00 AM - 12:00 AM - Sun - 203 

那麼什麼,我試圖做的是在表檢查,房間已在特定時間內分配,例如,如果從上午10:00到上午11:00在Sun分配了一個房間,那麼在該特定日期之前沒有其他時間表在該時間存在或可用。它不能像上午10點20分到上午11點重疊,從上午10點開始,已經有一個時間表。同樣,我必須確保在特定日期(太陽)的其他時間安排,例如上午11:00至中午12:00也可用。這只是需要做驗證。

就是這樣。我試圖用SQL查詢來做到這一點,並希望它會很簡單。所以試圖查詢是真的不夠好(僅用於演示目的):

SELECT * 
FROM AllocateRoom 
WHERE 
    CONVERT(Time, FromTime) >= CONVERT(Time, '10:00 AM') 
    AND CONVERT(Time, ToTime) <= CONVERT(Time, '11:00 AM') 

它實際上是可以使用SQL查詢來做到這一點?

+0

MS SQL Server 2008中(和更新版本)允許這種轉換。 –

+0

你試過的查詢有什麼問題? –

+0

當您的範圍跨越午夜時,您將遇到問題。你將不得不在你的邏輯中使用星期幾。然後,當然,你還有周六到週日來考慮這一週何時開始。您要存儲多少天的數據? – shawnt00

回答

0

這是我們試圖執行以下,幾乎行之有效:

string scheduleTime = ""; 
    bool found = false; 

    foreach (AllocateRoom allocate in allocatedRooms) 
    { 
     DateTime existingFromTime = Convert.ToDateTime(allocate.FromTime); 
     DateTime existingToTime = Convert.ToDateTime(allocate.ToTime); 

     bool matchRoom = allocate.RoomNo == aAllocateRoom.RoomNo; 
     bool matchDay = allocate.Day == aAllocateRoom.Day; 

     bool matchFromTime = existingFromTime == nFromTime; 
     bool matchToTime = existingToTime == nToTime; 

     bool coverExistingRange = nFromTime < existingFromTime & nToTime > existingFromTime; 
     bool coverExistingRange2 = nFromTime < existingToTime & nToTime > existingToTime; 

     bool toTimeInTheRange = nToTime > existingFromTime & nToTime < existingToTime; 
     bool fromTimeInTheRange = nFromTime > existingFromTime & nFromTime < existingToTime; 

     bool matchTime = matchFromTime || matchToTime; 
     bool coverTime = coverExistingRange || coverExistingRange2; 
     bool overlapTime = toTimeInTheRange || fromTimeInTheRange; 

     if (matchRoom & matchDay & (matchTime || overlapTime || coverTime)) 
     { 
      scheduleTime = "Room " + allocate.RoomNo + " - " + allocate.Day + " " + allocate.FromTime + " - " + allocate.ToTime; 
      found = true; 
     } 
    } 

    if (found) 
    { 
     message = scheduleTime + " has been already scheduled!"; 
     return message; 
    }