【发布时间】:2016-04-18 12:57:53
【问题描述】:
我的第一个问题..!
我不是 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;
【问题讨论】:
-
标记使用的 dbms。 (该代码不符合 ANSI SQL。)
-
使用
OBJECT_ID表示MS SQL Server
标签: sql sql-server tsql