我在这里的第一个问题..!
我不是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;
答案 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将被包括在内,这正是我想要的:)