3

私のコードから、次を使用して SP を呼び出します。

using (var cmd = new SqlCommand("sp_getnotes"))
{
  cmd.Parameters.Add("@ndate", SqlDbType.SmallDateTime).Value
                  = Convert.ToDateTime(txtChosenDate.Text);
  cmd.CommandType = commandType;
  cmd.Connection  = conn;

  var dSet = new DataSet();
  using (var adapter = new SqlDataAdapter { SelectCommand = cmd })
  {
    adapter.Fill(dSet, "ntable");
  }
}

ストアド プロシージャ自体は、単純なクエリを実行します。

SELECT * FROM tblNotes WHERE DateAdded = @ndate

問題は、レコードが返されないことです! DateAddedsmalldatetimeコラムです。

クエリを次のように変更すると、機能します。

SELECT * FROM tblNotes WHERE CONVERT(DATETIME, FLOOR(CONVERT(FLOAT, DateAdded))) = @ndate

なぜこうなった?この変更はアプリケーション全体に影響を与えるため、すべてのクエリを変更する前に根本的な原因を突き止めたいと考えています...私たちが行った唯一の変更は、パラメーター化されたクエリを使用し、SQL Server 2005 から 2008 にアップグレードすることです。

ティア。

4

3 に答える 3

5

smalldatetime同様に一致する必要がある時間部分があります。

これを使って:

SELECT  *
FROM    tblNotes
WHERE   dateAdded >= CAST(@ndate AS DATE)
        AND dateAdded < DATEADD(day, 1, CAST(@ndate AS DATE))

SQL Server 2008以上で、これも使用できます:

SELECT  *
FROM    tblNotes
WHERE   CAST(dateAdded AS DATE) = CAST(@ndate AS DATE)

オプティマイザーによって範囲への変換が実行されるため、効率的です。

于 2012-06-06T12:33:43.080 に答える
1

SQL Server 2008 には、SMALLDATETIME のように時間部分を保持しない DATE データ型が含まれるようになりました。列のデータ型を変更できない場合は、比較を行うときに切り捨てるか、単純に DATE にキャストする必要があります。

SELECT  * 
FROM    tblNotes 
WHERE   cast(dateAdded as date) = @ndate 
于 2012-06-06T12:40:04.737 に答える
0

私は SQL Server を知りませんが、Oracle の経験から、日時を日付と比較しているのではないかと思います。

于 2012-06-06T12:36:59.740 に答える