查询记录

问题描述:

我想从“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

我不靠近我就可以了电脑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

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