2009-08-31 28 views
1

日付を比較するSQLServer 2005のSPの一部のT-SQLに問題があります。私はC#からADO.Netでストアドプロシージャを実行しています。ネイティブのC#datetimeデータ型を渡しています(これは私の問題ですが、範囲が少し違うことがわかります)。私は私のSPで2つのDateTime値を比較するために次のことを行います。SQL Server 2005の比較日付

CREATE PROCEDURE [dbo].[spGetLikelyMatchedIndividuals_v1] 
    @ID BIGINT = NULL, 
    @DOB DATETIME = NULL, ... 

WHERE ISNULL(CONVERT(CHAR(8),Ind.[DateOfBirth],112),'') = ISNULL(CONVERT(CHAR(8),@DOB,112),'') 

これはほとんどの場合は問題なく動作しますが、何らかの理由でDatetimeで失敗することがあります。これは失敗するdatetime値の1つです:

1925-07-04 

これはなぜ失敗する可能性がありますか?また、時間の成分なしで2つの日付の値を比較する最良の方法は何ですか?

+0

エラーはどうなりますか?あなたもそれを提供できますか? – anishMarokey

+0

エラーは全くありません。日付を機械ではなく:-(SQLServer Managment StudioからSPを実行し、日時の値を国際日付として入力すると、datepartsと混同していると考えられました。 – StarSignLeo

+0

私はちょうど次のC#でこれをチェックします: DOB =新しいDateTime(DOB.Value.Year、DOB.Value.Month、DOB.Value.Day); 正しい月の部分と日の部分 – StarSignLeo

答えて

2

あなたの日付のようなものは正しいと思われます。この問題を引き起こしている他のロジックかもしれません。おそらく、ストアドプロシージャの多くを貼り付けて、起こりそうな問題を見つけるべきでしょう。

+0

正しい結果を除外していたストアドプロシージャにログインしていて、クエリが有効な日付を返していました。すべての時間を無駄にして申し訳ありません。 – StarSignLeo

0

日付コンポーネントを比較したいだけですか?あなたはそれを比較することができます

FLOOR(CAST(x.[SomeDate] as float)) = FLOOR(CAST(@SomeDate as float)) 

多くの文字列の仕事が少なく、仕事をする必要があります。さらに良い; 1日の範囲を作成し、それを使用...

DECLARE @from datetime, @to datetime 

SET @from = CAST(FLOOR(CAST(@SomeDate as float)) as datetime) 
SET @to = DATEADD(day, 1, @from) 

... 
WHERE x.[SomeDate] >= @from AND x.[SomeDate] < @to 
+0

といくつかnullハンドリング、もちろん... –

1

あなたはSQL-Server上の日付を比較している場合は、DateDiff機能を調べます。

2つの日付を非常に簡単に比較し、粒度を指定することができます。最寄りの日、時、分、または何でもかまいません。

例では、値の1つが日時であるため、Convert関数を使用して、他の値をその型に変換します。

2

さらに、インデックスを使用できないため、テーブルに対してロジックを使用しないでください。

@DOB変数が正しい形式になっていることを確認するために、フロントエンドのアプリケーションに処理させてください。

+0

+1 - 私はここであなたのスポットは、データベース内で働いているデータが、あまりにも多くの場所の時間部分を持っていると思います:-( – StarSignLeo

+0

それは回避することができます。 "WHERE BirthDate Could (CONVERT(VARCHAR(10)、@DOB、101)AS DATETIME)とDATEADD(「CONVERT(VARCHAR(10)、@DOB、101)AS DATETIME」)「 – mrdenny

0

文字列の操作は時々高価です。キャストなしの時間部分を無視して日付を選択する例を示します。

Select dateadd(dd,0, datediff(dd,0, yourdatetimeval)) as date_column