2016-04-18 11 views
1

ここに私の最初の質問..!SQLは一定時間内にわずか数時間しか値を取得しませんか?

私はSQLのエキスパートではありません。 :)

MSSQLデータベースからレポートデータを取得するWebページ(私によって作成されていない)があります。開始日と終了日を入力するWebページで、この時間間隔は00:00から終了日の23:59までの開始日。

SQLにさらにクエリを追加することができましたが、今では、特定の値に対して、毎日00:00:00から04:00:00までの時間範囲に記録された値のみを返します。選択された時間間隔。

現在、値は1時間に1回記録されますが、必ずしも一貫して記録されるわけではありません。これまでのところ私は最初の4つの値を表示し、次の20をスキップして、選択した間隔でこのループを行うWebページで回避策を作成しました。この方法は98%の時間で動作しますが、時には1日あたり24個以上のログ値が存在することもあります。これは、表示された値が一方向に歪む原因となります。

私がしたいのは、選択した期間の毎日の(午前0時から午前4時までの)欲しい時間範囲の値のみを返すようにSQLクエリを変更することです。私は誰かがこれを達成するのを助けたり、私にいくつかのヒントを与えるのを願っています! :)

これは、すべての値が必要な変数で実行されている既存の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

すばやく返信いただきありがとうございます。

あなたの提案はうまくいくわけではありませんでしたが、私はあなたの提案のおかげで問題を解決しました!

4時間に制限するSQLクエリは1つのWebページからしか使用されないため、このWebページに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; 

に私は、新しいファイルに古いからWebページに.SQLファイルへの呼び出しを変更し、それが動作します!そのような単純な! 03:59:59が含まれているので、0と4を0と3に変更しました。

+0

へようこそスタックオーバーフロー!このような「フォローアップ」情報は、それが適用される返信にコメントとして投稿されるのがベストです。回答が常に投稿された順番で表示されるわけではないので、2番目の回答として行われることは混乱する可能性があります。また、最も有益な回答(@Tom H's)を元の質問に「同意する」ことを忘れないでください。 –