2017-10-09 14 views
0

私は、上記の日付よりも実際に古い日付のレコードを返すクエリを作成しました。なぜ私のクエリはwhere句の条件を満たさないレコードを返しますか?

Declare @DateFrom date 
Set @DateFrom= '02/Oct/2019' 

SELECT 1, Convert(varchar(11), AppliedDateTime, 106) 
FROM [MC_Tenders].[dbo].[AppliedWorks] 
Where 
Convert(varchar, AppliedDateTime,106) >= Convert(varchar, @DateFrom,106) 

適用日はdatetimeのようにテーブルに保存されます。 2017-04-25 15:51:25.257

答えて

5

の文字列ではなく、日付を比較しています。変換を削除します。

SELECT 1, Convert(varchar(11), AppliedDateTime, 106) 
FROM [MC_Tenders].[dbo].[AppliedWorks] 
WHERE AppliedDateTime >= @DateFrom; 

タイプ106はdd mm yyyyです。文字列として比較すると、の文字列が比較され、日付は比較されません。形式106では、日のが最初に比較されます。'18-10-2017' < '25-12-1900' "1" < "2"です。

SELECT 
    1 
    , CAST(AppliedDateTime AS DATE) AS AppliedDate 
FROM 
    [MC_Tenders].[dbo].[AppliedWorks] 
WHERE 
    CAST(AppliedDateTime AS DATE) >= @DateFrom; 

は編集:私はAppliedDateTimeが実際にdatetime型として格納されていると仮定し、またはDATE以外のいくつかのデータ型だ

0

ただ、ゴードン・リノフの思考を完了するために、あなたのコードは次のようになります。 DATE型への明示的なCASTは時間コンポーネントを取り除き、SQLに日付コンポーネントと変数を単に比較させます。

+0

'> ='比較のために 'datetime'を' date'にキャストする必要はありません。 –

+0

かなりの批判ですが、OPはAppliedDateTimeがどのように格納されているかを言っていませんでした。フィールドが文字列であっても、明示的なキャストは(通常)機能します。 –