2011-08-31 245 views
0

我想從「TDATA」,其中一個臨時的時間內FooTime列值範圍表「TTIME」查詢記錄

TDATA表中提取記錄:

 
FooTime   Value 
2010-01-01 00:15 3 
2010-01-01 00:30 2 
2010-01-01 00:45 4 
2010-01-01 01:00 5 
2010-01-01 01:15 1 
2010-01-01 01:30 3 
2010-01-01 01:45 4 
2010-01-01 02:00 12 
2010-01-01 02:15 13 
2010-01-01 02:30 12 
2010-01-01 02:45 14 
2010-01-01 03:00 15 
2010-01-01 03:15 3 
2010-01-01 03:30 2 
2010-01-01 03:45 3 
2010-01-01 04:00 5 
.......... 
.......... 
.......... 
2010-01-02 00:15 3 
2010-01-02 00:30 2 
2010-01-02 00:45 4 
2010-01-02 01:00 5 
2010-01-02 01:15 1 
2010-01-02 01:30 3 
2010-01-02 01:45 4 
2010-01-02 02:00 12 
2010-01-02 02:15 13 
2010-01-02 02:30 12 
2010-01-02 02:45 14 
2010-01-02 03:00 15 
2010-01-02 03:15 3 
2010-01-02 03:30 2 
2010-01-02 03:45 3 
2010-01-02 04:00 5 
.......... 
.......... 
.......... 


TTIME表:

 
StartTime   EndTime 
2010-01-01 02:00  2010-01-01 06:00 
2010-01-02 02:00  2010-01-02 06:00 
.... 
.... 
.... 

根據上面的樣本數據,以下記錄應該因爲時間返回:

 
FooTime   Value 
2010-01-01 02:00 12 
2010-01-01 02:15 13 
2010-01-01 02:30 12 
2010-01-01 02:45 14 
2010-01-01 03:00 15 
2010-01-01 03:15 3 
2010-01-01 03:30 2 
2010-01-01 03:45 3 
2010-01-01 04:00 5 
... 
... 
2010-01-01 06:00 3 


2010-01-02 02:00 12 
2010-01-02 02:15 13 
2010-01-02 02:30 12 
2010-01-02 02:45 14 
2010-01-02 03:00 15 
2010-01-02 03:15 3 
2010-01-02 03:30 2 
2010-01-02 03:45 3 
2010-01-02 04:00 5 
... 
... 
2010-01-02 06:00 3 

請考慮的時間範圍可能是不同的日子不同,例如: TTIME表:

 
StartTime   EndTime 
2010-01-01 02:00  2010-01-01 06:00 
2010-01-02 19:00  2010-01-02 24:00 
.... 
.... 
.... 
+0

你是說你想根據tTime中定義的所有*範圍來限制tData中的所有行嗎? – Brettski

回答

2

我不靠近我就可以了電腦MS SQL,但這應該做的伎倆:

SELECT tData.* 
FROM 
    tData 
    LEFT JOIN tTime 
     ON CONVERT(VARCHAR(10), tTime.StartTime, 101) = CONVERT(VARCHAR(10), tData.FooTime, 101) 
WHERE 
    tData.FooTime BETWEEN tTime.StartTime AND tTime.EndTime 

本質加入基於日期的兩個表(沒有時間)startTime和FooDate的一部分,然後只在WHERE子句中使用之間。

正如我所說,我不能在這檯筆記本電腦上測試這個,但我會說它會工作。

編輯:這是假設有每行只有1天的TTIME表按你的例子​​

編輯:只記得,你應該能夠在JOIN標準之間使用,所以這應該是更好:

SELECT tData.* 
FROM 
    tData 
    INNER JOIN tTime 
     ON tData.FooTime BETWEEN tTime.StartTime AND tTime.EndTime 
+0

tTime表中每行必須少於1天。 – unruledboy

1
SELECT FooTime, Value 
FROM tData INNER JOIN tTime 
    ON (tData.FooTime >= tTime.StartTime AND tData.EndTime <= tTime.StopTime) 

我不記得是否之間被允許聯接子句中,但如果它是:

SELECT FooTime, Value 
FROM tData INNER JOIN tTime 
    ON (tData.FooTime BETWEEN tTime.StartTime AND tData.EndTime) 
+0

嗨,你的第一個查詢是不正確的考慮時間比較,但你的第二個是正確的。 – unruledboy

+0

對不起,我沒有把你的答覆標記爲答案,因爲你們最後都給出了正確的答案,這很難決定。所以根據「先到先得」的規定,我把它交給了mwan100。無論如何非常感謝你。 – unruledboy