2016-08-09 6 views
0

間の記録を見たときに、次のように私の問題がある:SQL ServerのSUM DATEDIFFとNULL二つの日付

私は列を持つ(表と呼ばれる)のテーブルを持っている:ID、イベント、STARTDATE、終了日は

STARTDATEが行きます1900年1月1日から今日まで、enddateも同様です。イベントは任意の文字列であり、各IDは時間の経過とともに複数のイベントを開始したり終了したりします(ただし、一度に1つのイベントのみです)。

1989-01-01と2000の間の日付のレコードを取得する場合-01-01。私たちは日付の違いを合計して、各IDが何らかの出来事をしているのに費やした週の総数を得たいと思っています。

私が持っている問題は、興味がありますので、その終了日はnullです。

私は現在

SELECT 
    id, 
    ISNULL(enddate, 2000-01-01 sum(datediff(weeks, startdate, enddate)) AS wksdoingstuff 
WHERE 
    event IN ('something', 'somethingelse'. 'anotherthing') 
    AND BETWEEN 1989-01-01 AND 2000-01-01 
GROUP BY 
    id 
をしようとしています

は私が何をした後:私は明確なIDの行をしたい

、それぞれが(現時点では私のコードを、彼らが興味

のイベントにあった何週間分のカウントを持っていますなく、かなり私は何そこに書いてある)私は各IDごとに複数の行を与えています。

+2

あなたは私たちを示してきたコードを実行することができることにも、近くではありません。 ** runnable **コードの自己完結型の例を作成してみてください(実際には 'FROM'節を使ってテーブルの変数にデータを入力し、実際にそれからクエリを実行することをお勧めします。 'ISNULL'行など) –

+0

また、あなたが探している出力を明確に定義する必要があります。 'DATEDIFF'は*遷移*を数えます。あなたが'週 'ではなく' week'を意味すると仮定した場合、最初のものが土曜日で2番目のものが2日目の場合は1日だけ2を返します日曜日です。それはあなたが望む行動ですか?ここでは*部分的な週数を考慮する必要がありますか? –

+0

はい、部分的な振る舞いは分析には問題ありません。さらに、私はいつもデータが合理的かどうかを確認することができます。 私のコードは実行されないと認識しています。私はサーバーにアクセスするコンピュータではありません。私はインターネットにアクセスできないので、回答とメモを書き留める必要があります。それ。 –

答えて

0

where句でend dateがnullでない部分が必要で、返された列でisnullを削除する必要があります。 datediff psrtの周りで合計を行う必要があります。申し訳ありませんが、私は自分の携帯電話に乗っているので、コードの入力に直面することはできません。私が覚えていれば、後でキーボードを持っていれば、私は戻ってきます!

また、あなたがdatediffでdd(days)を使用する必要があることに同意します。そうでないと、部分的な週が失われます。あなたはいつもあなたがこれを実行する必要が7.00

+0

私のwhere節にはnotnullが入っていますか?しかし、私は任意に、NULLSが日付2000-01-01であると言っています。なぜなら、私は基本的に、日付のウィンドウ中にいくつかのイベントをグループ化して何週間になったのかを数えているからです。 null以外の日付だけを追加したくない場合は、終了日がnullのユーザーはまだイベントに参加しており、参加している期間を数えたいと思っています。 –

0

により、小数点にキャストAMD合計を分割することができます。..

SELECT 
    id, 
    sum(datediff(weeks, startdate, ISNULL(enddate, '2000-01-01')) AS wksdoingstuff 
WHERE 
    event IN ('something', 'somethingelse'. 'anotherthing') 
    AND BETWEEN 1989-01-01 AND 2000-01-01 
GROUP BY 
    id 
+0

ありがとう –

+0

これは完全に機能しました –