0

それは私の最初の投稿であり、私はMSSQLに本当に慣れていないので、優しくしてください:-)

datediff を使用しようとしているテーブルがあります。最初にクエリと結果を投稿すると簡単だと思います

select mh.agetime, mh.whatid

from mailhistory mh
inner join mail m
 on mh.mailid=m.myid
where (mh.whatid=17 or mh.whatid=11 or mh.whatid=0) and maincontactid=287816 and mailid=276086

order by agetime

本当に、maincontactid と mailid は現在、クエリを作成している間に結果を制限するためにそこにあるだけです。

結果は次のとおりです...

AGETIME                    WHATID
1899-12-30 00:00:00.000 0
1899-12-30 00:48:10.000 11
1899-12-31 02:16:49.000 17
1899-12-31 06:29:08.000 11
1900-01-18 15:31:40.000 17
1900-02-11 14:56:59.000 11

クエリの実行時に 3 番目の列を作成しようとしています。これにより、日付 (日数) の違いを示す 3 番目の列が作成されます... WHATID が 11 と 17 のアイテム間で...これ:

AGETIME                    WHATID    DIFFERENCE
1899-12-30 00:00:00.000 0         NULL
1899-12-30 00:48:10.000 11        0
1899-12-31 02:16:49.000 17        1
1899-12-31 06:29:08.000 11        0
1900-01-18 15:31:40.000 17        18
1900-02-11 14:56:59.000 11        22

そのようなもの...だから、そのような実行中のdatediffを行うようにクエリを変換する方法はありますか?

よろしくお願いします!

クリス

4

1 に答える 1

0

SQL Server 2005 以降を使用している場合は、CTE を作成して現在の結果セットに row_number を割り当てることができます。次に、Current.Row_Num = Previous.Row_Num -1 を使用して CTE で左自己結合を行い、日付の差を取得できます。アプローチは、このリンクに示されているように似ています。

http://www.kodyaz.com/articles/sql-select-previous-and-next-rows-with-current-row-in-tsql.aspx

SQL Server 2000 の場合

結果セットにグループ化がない場合:

おそらく、Identity Filed (rownumber として機能する) を使用して CTE の代わりに一時テーブル変数を作成し、2005 年の上記と同じロジックを適用します。CTE の代わりに一時テーブル変数を使用するのは大きな変更のみです。行番号の代わりに、一時テーブルで ID を使用します。

于 2010-05-04T14:18:46.370 に答える