簡體   English   中英

查詢記錄在SQL Server中以mutilple為單位的時間范圍

[英]Query records where time in mutilple ranges in SQL Server

我想從“ tData”中獲取記錄,其中臨時時間范圍表“ tTime”中的FooTime列值

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
..........
..........
..........

時間時間表:

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
....
....
....

我不在裝有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的Date(無時間)部分連接兩個表,然后在WHERE子句中使用BETWEEN。

正如我所說,我無法在這台筆記本電腦上對此進行測試,但我會說它可以工作。

編輯:根據您的示例,假設tTime表中每行只有1天

編輯:剛剛記住,您應該可以在JOIN條件中使用BETWEEN,因此應該更好:

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

我不記得是否在join子句中允許在Between之間,但是如果它是:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM