1

これは私を夢中にさせており、ここで何が欠けているのかわからない..

だからここに私のデータ列は次のようになります:

StartDateTime:
---------------
2012-01-17 11:13:46.530
2012-01-17 11:17:22.530
2012-02-17 11:31:22.223

取得しようとしているクエリは次のとおりです。

select * from tablName
where convert(varchar(10), startDateTime, 101) between '2012-01-17' and '2012-01-17'

上記に基づいて、2行を取得する必要がありますか? しかしそうではなく、ゼロ行を返します。正しいやり方は何でしょう?

PS:MSDNサイトも見ました:

4

4 に答える 4

3

クエリは ~ の間の日付のみに一致し2012-01-17 00:00:00ます2012-01-17 00:00:00。したがって、一致するのは、日付が正確に の場合のみです2012-01-17 00:00:00

代わりに、次のようにします。

declare @dateInput as DateTime
set @dateInput = '2012-01-17'

select * 
from tablName 
where startDateTime >= @dateInput
    and startDateTime < dateadd(day, 1, @dateInput)

注: SQL Server 2008+ には、Dateこれらのタイプのクエリをより読みやすくする時間コンポーネントのない新しいデータ タイプがあります。

于 2012-06-26T16:12:52.903 に答える
1

より多くの情報が得られたので、より適切な回答を追加します。要件は、DateTime ではなく、Date 型パラメーターが渡されたストアド プロシージャであり、StartDateTime という名前の DateTime フィールドに対する基準に基づいてテーブルから行を返すことが望まれます...

create procedure dbo.spGetEntriesForOneDay
@DesiredDate DateTime
as
SET NOCOUNT ON;
SET @DesiredDate = DATEADD(day, DATEDIFF(day, 0, @DesiredDate), 0)

SELECT Field1, Field2 -- see note 1
FROM dbo.TableName
WHERE StartDateTime >= @DesiredDate -- see note 2 
  AND StartDateTime < DATEADD(day, 1, @DesiredDate)  -- see note 3

注 1 : 製品コード、特にストアド プロシージャでは * を使用しないでください。おそらく必要のない列を返すことで無駄が発生し、必要な列のサブセットに対するカバリング インデックスの最適化を排除するだけでなく、予期しない結果を避けるために、基になるテーブルが変更されるたびにこのストアド プロシージャを再コンパイルする必要があります。

注 2 : 関数内でフィールドをラップしないでください。関数にラップされていないフィールドは、オプティマイザーによってインデックスに一致する可能性がありますが、関数にラップされているフィールドは決して一致しません。

注 3 : @Martin Smith と @RedFilter は、.997 精度が DateTime データ型を永久に想定するという点で正しいです。このアプローチは、データ型の精度を想定していないため、より将来性があります。

于 2012-06-26T16:30:52.507 に答える
0

where 句で DateDiff 関数を使用できます。次のようになります。

select col1, col2 from tablName where DateDiff(day, startDateTime, @DesiredDate) = 0
于 2012-06-26T16:42:28.090 に答える
0

あなたは日時フィールドを使用しています(私は推測しています)。時間を忘れないでください:

select * from tablName
where startDateTime between '2012-01-17' and '2012-01-17 23:59:59.997'
于 2012-06-26T16:13:43.957 に答える