SQL在给定时间内只获得几个小时的值?

时间:2016-04-18 12:57:53

标签: sql sql-server tsql

我在这里的第一个问题..!

我不是SQL的专家,所以请耐心等待我! :)

我有一个网页(不是我创建的),它从MSSQL数据库获取报告数据,在您输入开始日期和结束日期的网页上,数据从开始日期的00:00开始,直到此时间间隔内提取结束日期23:59。

我已经设法向SQL添加了更多查询,但是现在我想,对于某些值,只返回在每天00:00:00到04:00:00之间记录的值。选定的时间间隔。

目前每小时记录一次值,但并不总是一致。到目前为止,我已经在我的网页上做了一个解决方法,它显示了前4个值并跳过了接下来的20个,这个循环用于所选的时间间隔。此方法在98%的时间内都有效,但偶尔每天记录的值多于或少于24个,这可能会导致显示的值以某种方式偏斜。

我想要做的是更改我的SQL查询,使其仅返回所选时间段内每天所需时间范围内的值(午夜和04:00之间)。我希望有人可以帮助我实现这一目标或给我一些提示! :)

这是使用我想要所有值的变量运行的现有SQL查询。有比这更多的变量,但我把它们编辑出来,所有Ren * Time变量都是我想要制作每天4小时版本的变量。

SET NOCOUNT ON;

IF OBJECT_ID('tempdb..#tmpValues') IS NOT NULL BEGIN DROP TABLE #tmpValues END;

CREATE TABLE #tmpValues(Id INT PRIMARY KEY IDENTITY(1,1),BatchId INT, TimePoint DATETIME, Ren1Time DECIMAL(10,2), Ren2Time DECIMAL(10,2), Ren3Time DECIMAL(10,2), RenTotTime DECIMAL(10,2));

INSERT INTO #tmpValues(BatchId)
    SELECT BatchId          
    FROM Batch
    WHERE Batch.LogTime BETWEEN <StartTime> AND <StopTime>;

CREATE UNIQUE INDEX I_BatcId ON #tmpValues(BatchId);

UPDATE #tmpValues SET 
TimePoint = (SELECT LogTime FROM Batch WHERE Batch.BatchId = #tmpValues.BatchId),
Ren1Time = (SELECT SUM(_Float) FROM LogData WHERE LogData.BatchId = #tmpValues.BatchId AND LogData.TagId = 21),
Ren2Time = (SELECT SUM(_Float) FROM LogData WHERE LogData.BatchId = #tmpValues.BatchId AND LogData.TagId = 25),
Ren3Time = (SELECT SUM(_Float) FROM LogData WHERE LogData.BatchId = #tmpValues.BatchId AND LogData.TagId = 29),
RenTotTime = (SELECT SUM(_Float) FROM LogData WHERE LogData.BatchId = #tmpValues.BatchId AND (LogData.TagId = 25 OR LogData.TagId = 29 OR LogData.TagId = 33));

DECLARE 
@TimePoint DATETIME,
@Ren1Time FLOAT,
@Ren2Time FLOAT,
@Ren3Time FLOAT,
@RenTotTime FLOAT;

INSERT INTO #tmpValues(TimePoint, Ren1Time, Ren2Time, Ren3Time, RenTotTime)
    VALUES(@TimePoint, @Ren1Time, @Ren2Time,@Ren3Time, @RenTotTime);        
SET NOCOUNT OFF; 

SELECT * FROM #tmpValues; 
IF OBJECT_ID('tempdb..#tmpValues') IS NOT NULL BEGIN DROP TABLE #tmpValues END;

2 个答案:

答案 0 :(得分:2)

不要乱用临时表并分别处理每一列。我也不知道你在尝试用这些变量做什么。你声明它们,从不设置它们,然后用它们做INSERT,这只会插入一行NULL值。

假设您正在使用SQL Server,DATEPART功能将让您获得当天的小时。

SELECT
    B.BatchID,
    B.LogTime AS TimePoint,
    SUM(CASE WHEN B.TagId = 21 THEN _Float ELSE 0 END) AS Ren1Time,
    SUM(CASE WHEN B.TagId = 25 THEN _Float ELSE 0 END) AS Ren2Time,
    SUM(CASE WHEN B.TagId = 29 THEN _Float ELSE 0 END) AS Ren3Time,
    SUM(CASE WHEN B.TagId IN (21, 25, 29) THEN _Float ELSE 0 END) AS RenTotTime
FROM
    dbo.Batch B
INNER JOIN LogData LD ON LD.BatchId = B.BatchId
WHERE
    B.LogTime BETWEEN <StartTime> AND <StopTime> AND
    DATEPART(HOUR, B.LogTime) BETWEEN 0 AND 4
GROUP BY
    B.BatchID,
    B.TimePoint

答案 1 :(得分:0)

非常感谢您的快速回复!

我无法确切地说明你的建议,但是由于你的建议我确实解决了我的问题!

由于应该限制为4小时的SQL查询仅在一个网页中使用,并且此网页中没有值应该在24小时内显示,我想我可以将现有的.SQL文件复制到一个新文件,只需更改以下内容:

WHERE Batch.LogTime BETWEEN <StartTime> AND <StopTime>;

WHERE Batch.LogTime BETWEEN <StartTime> AND <StopTime> AND DATEPART(HOUR, Batch.LogTime) BETWEEN 0 AND 3;

我将网页中的.SQL文件的调用从旧文件更改为新文件,并且可以正常工作!就那么简单!也改为0和4为0和3,因为我发现03:59:59将被包括在内,这正是我想要的:)