2016-04-18 20 views
1

我的第一個問題在這裏..!SQL在給定時間段內只能獲得數小時的值?

我不是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

標記所使用的dbms。 (該代碼不符合ANSI SQL標準。) – jarlh

+0

使用'OBJECT_ID'表示MS SQL Server –

回答

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 
0

非常感謝您的迅速回復!

我無法確切地得到您的建議,但我確實已經解決了我的問題,這要歸功於您的建議!

由於SQL查詢應該限制在4個小時內,只能從一個網頁使用,並且在此網頁中沒有值應該顯示所有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文件的網頁,從舊到新的文件和它的作品!就那麼簡單!由於我找到了03:59:59,所以也將0和4更改爲0和3,這正是我想要的:)

+0

歡迎使用堆棧溢出!此類「後續」信息最好作爲對其適用答覆的評論發佈;作爲第二個答案完成可能會令人困惑,因爲答案並不總是按他們發佈的順序列出。此外,不要忘記「接受」最有用的答案(@湯姆H's)到你原來的問題。 –

相關問題