タイプdateTimeの列を持つテーブルがあります。その日付に発生するすべての行を選択するクエリを実行したいと考えています。基本的、
SELECT * FROM Table
WHERE [timeStamp] = '02-15-2003'
しかし、それは [timeStamp] が '02-15-2003 00:00:00.000' である行のみを返しますが、実際にはその日のいつでも行が必要です。
タイプdateTimeの列を持つテーブルがあります。その日付に発生するすべての行を選択するクエリを実行したいと考えています。基本的、
SELECT * FROM Table
WHERE [timeStamp] = '02-15-2003'
しかし、それは [timeStamp] が '02-15-2003 00:00:00.000' である行のみを返しますが、実際にはその日のいつでも行が必要です。
インデックスがある場合は、インデックスの使用を妨げないものが必要になります。
SELECT *
FROM Table
WHERE [timeStamp] >= '20030215'
AND [timeStamp] < '20030216'
列に対して切り捨て操作を実行して、[timeStamp]
任意の時間部分 (実装に依存) を取り除くことができますが、これにより実行計画が損なわれる可能性があります。残念ながら、これを確認するには、実際に実行計画を確認する必要があります。なぜなら、オプティマイザーが一部の関数について賢い場合とそうでない場合があるためです。
SQL 2008 を使用している場合は、DATE にキャストする必要があります。
select * from [Table]
where cast([timeStamp] as date) = '02-15-2003'
SQL Server で日時の時刻部分を削除するための最良の方法
- - アップデート - -
これが最適な解決策ではない理由を説明するために 2012 年にコメンテーターが使用すべきだった言葉は、sargabilityです。WHERE 句のデータ型を変更することは、最も簡単な解決策ですが、インデックスの使用に影響を与えますが、限定検索では影響しません。
in sql server 2008 + :
SELECT * FROM Table
WHERE cast( [timeStamp] as date) = '02-15-2003'
or
just ZERO the time part : ( 2005+)
SELECT * FROM Table
WHERE DateAdd(day, DateDiff(day, 0, [timeStamp]), 0) = '02-15-2003'
MS SQL 2014、これは完璧に機能します:
SELECT [YourDateColumn] FROM [YourTable] WHERE(DATEPART(dd,[YourDateColumn]) = '29')
非常に大規模な DB では、パフォーマンスの問題が発生する可能性があります。
これを試してください..SQLSERVER
SELECT * FROM Table WHERE convert(date,[timestamp]) = '2003-02-15'
指定された日にすべての行を返す必要があります。
「開始日」と「終了日」を受け入れるストアド プロシージャを作成します。
この場合、開始日と終了日を同じにすることができます
これにより、午前 0 時 1 分から午後 11 時 59 分までのすべての行が返されます。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Create PROCEDURE TestBetweenDates
-- Add the parameters for the stored procedure here
@StartDate DateTime = 0,
@EndDate DateTime = 0
AS
BEGIN
SET NOCOUNT ON;
SET @StartDate = cast(Convert(varchar(10), DateAdd(d, -6, @StartDate ), 101) + ' 12:01 AM' as datetime)
SET @EndDate = cast(Convert(varchar(10), DateAdd(d, -0, @EndDate), 101) + ' 11:59 PM' as datetime)
SELECT * FROM Table
WHERE ([timeStamp] BETWEEN @StartDate AND @EndDate)
END
GO
日付の比較は難しい場合があります。
これは日時であり、文字列ではないことに注意してください。これが、予期しない結果が得られた理由です。
念頭に置いている特定のクエリについて、適切なクエリは次のとおりです。
SELECT * FROM Table
WHERE 0 = datediff(day,[timestamp],'02-15-2003')
整数値を返す month() と year() による比較もできます。
通常、自明ではない比較を行うには、カスタム関数を作成する必要があります。
また、注意してください
WHERE 0 = datediff(day,[timestamp],'02-15-2003')
よりもはるかに優れています
WHERE datediff(day,[timestamp],'02-15-2003') = 0
前者は内部効率に干渉しませんが、後者は干渉します。