2013-03-28 157 views
1

我有一個似乎相當複雜的問題。我需要知道在某一天的某個時段會發生什麼。SQL查詢每天每小時

簡而言之,我有一個表格顯示給定區域的所有會話。這些會話具有開始日期和開始時間以及結束時間。

您可以在此表中看到:

idArea | idSession | startDate | startTime  | endTime 
    1 | 1  | 2013-01-01 | 1900-01-01 09:00:00 | 1900-01-01 12:00:00 
    1 | 2  | 2013-01-01 | 1900-01-01 14:00:00 | 1900-01-01 15:00:00 
    1 | 3  | 2013-01-04 | 1900-01-01 09:00:00 | 1900-01-01 13:00:00 
    1 | 4  | 2013-01-07 | 1900-01-01 10:00:00 | 1900-01-01 12:00:00 
    1 | 5  | 2013-01-07 | 1900-01-01 13:00:00 | 1900-01-01 18:00:00 
    1 | 6  | 2013-01-08 | 1900-01-01 10:00:00 | 1900-01-01 12:00:00 

然後我也有一個表,其中顯示了我所有的時間穿插,即每半小時(我創造了這個表上的宗旨,爲這個要求,如果有一個人更好的主意,我可以說我會盡力適應)。

idHour | Hour 
    1 | 1900-01-01 00:00:00 
    2 | 1900-01-01 00:30:00 
    3 | 1900-01-01 01:00:00 
    ............................ 
    4 | 1900-01-01 09:00:00 
    5 | 1900-01-01 09:30:00 
    6 | 1900-01-01 10:00:00 
    7 | 1900-01-01 10:30:00 
    ............................ 

在這就是我想要表達的理念最終是這樣的:

startDate | startTime  | SessionID 
    2013-01-01 | 1900-01-01 09:00:00 |  1 
    2013-01-01 | 1900-01-01 09:30:00 |  1 
    2013-01-01 | 1900-01-01 10:00:00 |  1 
    2013-01-01 | 1900-01-01 10:30:00 |  1 
    2013-01-01 | 1900-01-01 11:00:00 |  1 
    2013-01-01 | 1900-01-01 11:30:00 |  1 
    2013-01-01 | 1900-01-01 11:30:00 |  1 
    2013-01-01 | 1900-01-01 14:00:00 |  1 
    2013-01-01 | 1900-01-01 14:30:00 |  1 
    2013-01-01 | 1900-01-01 15:00:00 |  1 

此表僅供idSession = 1就是我想要的是所有會話。如果有一天沒有會話可以返回NULL。

這個查詢或過程很難,就是他們必須告訴我當月有關該區域的會話的所有日子。

對於這一點,我已經使用這個查詢:

;WITH t1 AS 
(
    SELECT 
     startDate, 
     DATEADD(MONTH, DATEDIFF(MONTH, '1900-01-01', startDate), '1900-01-01') firstInMonth, 
     DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH, '1900-01-01', startDate) + 1, '1900-01-01')) lastInMonth, 
     COUNT(*) cnt 
    FROM  
     @SessionsPerArea 
    WHERE 
     idArea = 1 
    GROUP BY 
     startDate 
), calendar AS 
(
    SELECT DISTINCT 
     DATEADD(DAY, c.number, t1.firstInMonth) d 
    FROM  
     t1 
    JOIN 
     master..spt_values c ON type = 'P' 
          AND DATEADD(DAY, c.number, t1.firstInMonth) BETWEEN t1.firstInMonth AND t1.lastInMonth 
) 
SELECT 
    d date, 
    cnt Session 
FROM 
    calendar c 
LEFT JOIN 
    t1 ON t1.startDate = c.d 

這是很複雜的,如果任何人有一個簡單的方法來做到這一點非常好。

+0

如果在給定時間段內有多個會話,您希望輸出什麼內容?每次和會話一行?當時有一排會議列表會議? – HABO

+1

對於我來說,考慮到你在做什麼似乎並不複雜。 –

+0

@HABO是的,每次和會話都有一行。這似乎是這個輸出的最佳解決方案。 – PookPook

回答

1

如果我理解正確的話,這簡直是日曆表之間@ SessionPerArea聯接,瓦特i個合適的條件:

select spa.StartDate, c.hour as StartTime, spa.idSession as SessionId 
from calendar c join 
    @SessionsPerArea spa 
    on c.hour between spa.startTime and spa.EndTime 

的加入是匹配的開始和結束時間之間的所有時間數據,然後返回值。

+0

但在這種情況下,只有那些相同的回報。在這種情況下,09:00:00和14:00:00。半個小時不會出現。 – PookPook

+0

@PookPook。 。 。在你的問題中,你說日曆表每半小時都有數據。所以,每半小時應該出現。 –

+0

我剛完成測試,幾乎完美。 唯一的問題是它不會返回一個月的所有日子。根據SessionArea的說法,甚至有一個SQL查詢返回了本月的所有日子。 如果可能會出現NULL會話。 – PookPook

0

我想也許你只需要在日曆和@SessionsPerArea之間進行外部聯接...所以日曆表中的所有日子都會返回,無論與@SessionsPerArea表匹配嗎?

+0

不要返回本月的所有日子。 – PookPook

+0

您的日曆表包含每一天,對嗎?所以這不是所有的日期?從日曆c中選擇spa.StartDate,c.hour作爲StartTime,spa.idSession作爲SessionId c左外連接 @SessionsPerArea spa 在c.our之間的spa.startTime和spa.EndTime – user2191219

+0

否。我的表日曆只返回小時。 – PookPook