【问题标题】:SQL get values for only a few hours in given time period?SQL 在给定时间段内仅获取几个小时的值?
【发布时间】: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


【解决方案1】:

不要乱用临时表并分别处理每一列。我也不知道你想用这些变量做什么。您声明它们,从不设置它们,然后对它们执行 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

【讨论】:

    【解决方案2】:

    非常感谢您的快速回复!

    我无法完全得到您的建议,但感谢您的建议,我确实解决了我的问题!

    由于应限制为 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 AND 4 更改为 0 AND 3,因为我发现 03:59:59 将被包括在内,这正是我想要的:)

    【讨论】:

    • 欢迎来到 Stack Overflow!像这样的“跟进”信息最好作为对其适用的回复的评论发布;作为第二个答案完成可能会令人困惑,因为答案并不总是按照它们发布的顺序列出。另外,不要忘记“接受”对原始问题最有用的答案(@Tom H's)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    相关资源
    最近更新 更多