2014-02-05 38 views
1

我有關於在存儲過程中組合表的問題。
注:場 「時間」 爲varchar
第一個表(tbTime)SQL多記錄:時間安排程序

Time 
08:00:00 
08:30:00 
09:00:00 
09:30:00 
10:00:00 
10:30:00 
11:00:00 
11:30:00 
12:00:00 
12:30:00 
13:00:00 
13:30:00 
14:00:00 
14:30:00 
15:00:00 
15:30:00 
16:00:00 
16:30:00 
17:00:00 
17:30:00 
18:00:00 
18:30:00 
19:00:00 
19:30:00 
20:00:00 

二表(tbClassRsv)

select * from tbclassrsv where transdate='2014-02-05 00:00:00' and status<>'DEL' 

transDate time  until status studentCode tutor class description userID 
2014-02-05 16:48:14 17:48:14 OPN  ET-7201  ET-444 ROOM 01 try   ADMIN 

我想這樣的

Time  Student 
08:00:00 - 
08:30:00 - 
09:00:00 - 
09:30:00 - 
10:00:00 - 
10:30:00 - 
11:00:00 - 
11:30:00 - 
12:00:00 - 
12:30:00 - 
13:00:00 - 
13:30:00 - 
14:00:00 - 
14:30:00 - 
15:00:00 - 
15:30:00 - 
16:00:00 - 
16:30:00 ET-7201 
17:00:00 ET-7201 
17:30:00 ET-7201 
18:00:00 ET-7201 
18:30:00 - 
19:00:00 - 
19:30:00 - 
20:00:00 - 
條件日程結果

感謝您的閱讀或回答^ _^

GBU

I`ve試過這種

​​

結果是....

Time  Student 
08:00:00 - 
08:30:00 - 
09:00:00 - 
09:30:00 - 
10:00:00 - 
10:30:00 - 
11:00:00 - 
11:30:00 - 
12:00:00 - 
12:30:00 - 
13:00:00 - 
13:30:00 - 
14:00:00 - 
14:30:00 - 
15:00:00 - 
15:30:00 - 
16:00:00 - 
16:30:00 - 
17:00:00 ET-7201 
17:30:00 ET-7201 
18:00:00 - 
18:30:00 - 
19:00:00 - 
19:30:00 - 
20:00:00 - 
+0

這是什麼問題? – Miller

+0

您正在使用哪些DBMS? – gvee

回答

1

試試這個。你並沒有將你的varchar時間轉換爲datetime,這樣你的時間比較就可以工作。

select t.time, 
isnull(
(select c.studentCode 
from tbClassRsv c 
where c.transdate='2014-02-05 00:00:00' 
and c.class='ROOM 01' 
and c.status<>'DEL' 
and DateAdd(MINUTE, 30, Convert(datetime, t.time))>= Convert(datetime, c.time) 
and Convert(datetime, t.time) <= Convert(datetime, c.until) 
),'-') from [tbTime] t 
+0

非常感謝您的幫助兄弟....這就是工作.... – Davis

1

你需要做的是圓c.time下調至最接近間隔30分鐘,並輪到c.until直至最近的間隔。這樣你的where子句將具有正確的範圍。

要做到四捨五入,你需要將時間轉化爲datetime,你可以做像這樣:

CAST(CONVERT(varchar,THE_TIME_AS_VARCHAR,121) AS datetime) 

然後你可以四捨五入到最接近30分鐘像這樣:

DATEADD(mi, DATEDIFF(mi, 0, THE_TIME_AS_DATETIME)/30*30, 0) 

和圓形像這樣:

DATEADD(mi, DATEDIFF(mi, 30, THE_TIME_AS_DATETIME)/30*30, 0) 

運用一切都交給你的現有代碼W¯¯應該給你這個:

select t.time, 
isnull(
(select c.studentCode 
    from tbclassrsv c 
    where c.transdate='2014-02-05 00:00:00' 
    and c.class='ROOM 01' 
    and c.status<>'DEL' 
    and t.time>= DATEADD(mi, DATEDIFF(mi, 0, CAST(CONVERT(varchar,c.time,121) AS datetime))/30*30, 0) 
    and t.time<= DATEADD(mi, DATEDIFF(mi, 30, CAST(CONVERT(varchar,c.until,121) AS datetime))/30*30, 0) 
),'-') [Student] 
+0

感謝您回答我的問題兄弟..^_^ – Davis