2012-05-10 11 views
1

dateTime型の列を持つテーブルがあります。その日に実行されるすべての行を選択するクエリを実行する必要があります。基本的には、SELECT WHERE Date =日

SELECT * FROM Table 
WHERE [timeStamp] = '02-15-2003' 

しかし、唯一の[タイムスタンプ] '02 -15-2003 00である行を返す:00:00.000' を、本当に私はその日いつでもから行をしたいです。 SQL Serverの2008 +で

+8

あなたはどのデータベースを使用していますか? SQLサーバー?オラクル? PostgreSQL? –

+0

SQL Server 2008 –

+0

mm-dd-yyyyではなくyyyymmddを使用することを強くお勧めします。また、これらの記事を読むことをお勧めします:http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx http:// www。 karaszi.com/SQLServer/info_datetime.asp –

答えて

14

あなたはインデックスを持っている場合は、あなたが使用しているから、インデックスを妨げるものではない何かをしたいとしている。

SELECT * 
FROM Table 
WHERE [timeStamp] >= '20030215' 
     AND [timeStamp] < '20030216' 

あなたはいつでも部分を取り除くために[timeStamp]列に切り捨て操作を行うことができます(実装に依存する)が、これは潜在的に実行計画を傷つける可能性がある。あいにく、オプティマイザがいくつかの関数について巧妙で、時にはそうでない場合があるので、実際にはこれを見るために実行計画を見なければなりません。

+4

フーラ!ついに正しい答えが1つ。そして、dba.seでここに参加することを考えましたか? http://chat.stackexchange.com/rooms/179/the-heap – gbn

+4

'mm-dd-yyyy'は言語/地域では安全ではありません。私はOPが使用していることを知っていますが、おそらくちょうどナッジが必要です。 –

+1

@Aaron Bertrandもし 'BETWEEN'が' [] 'のみを扱うので、' datecol WITHIN [lower、upper] 'のような様々なオープン/クローズ区間を簡単に扱えるものがあれば、それは大好きです。 –

0

SELECT * FROM Table 
        WHERE cast([timeStamp] as date)  = '02-15-2003' 

または

だけの時間部分をゼロ:(2005+)

SELECT * FROM Table 
    WHERE DateAdd(day, DateDiff(day, 0, [timeStamp]), 0) = '02-15-2003' 
+0

カラムに関数やキャストは必要ありません。ここで2番の数字を参照してください:http://www.simple-talk.com/sql/t-sql-programming/ten-common-sql-programming-mistakes/ – gbn

+2

@gbn DATEへの変換は実際に使用されていますが、すべての型変換には当てはまらないことに注意してください。 –

5

あなたがしている場合は、DATEにキャストする必要がありSQL 2008.

select * from [Table] 
where cast([timeStamp] as date) = '02-15-2003' 

Best approach to remove time part of datetime in SQL Server

--- --- UPDATE

言葉コメンターは、これが最適解がsargabilityではない理由を記述するために2012年に戻って使用している必要があります。 WHERE句のデータ型を変更するのは、最も簡単な解決策ですが、有界検索では使用できないインデックスの使用に影響します。

+0

列に機能やキャストはありません。 2番の数字はこちらをご覧ください:http://www.simple-talk.com/sql/t-sql-programming/ten-common-sql-programming-mistakes/ – gbn

+0

私は自分の答えを更新しました。 – gbn

+0

@gbn - より良い提案がありますか? SQL Serverの日付部分を削除する方法はそれほど多くありません。この方法は低摩擦で入力が簡単です。常に学術的に実用的であることを好む。 – mattmc3

-6

日付の比較は難しいことがあります。

これはdatetimeであり、文字列ではないことに注意してください。これが予期せぬ結果を得た理由です。あなたが考えている特定のクエリのために

は、適切なクエリは、整数値を返す

SELECT * FROM Table 
WHERE 0 = datediff(day,[timestamp],'02-15-2003') 
あなたはまたやるかもしれ

月で比較する()年()です。

一般的に、カスタム関数を記述して、簡単な比較を得る必要があります。

WHERE 0 = datediff(day,[timestamp],'02-15-2003') 

WHERE datediff(day,[timestamp],'02-15-2003') = 0 

後者はない前者は内部効率に干渉しないよりもはるかに良好であることに注意します。

+1

私はこれをテストして間違っています。あなたのバージョンでは、Cade Rouxとmattmc3が提供する回答の2倍の時間がかかります。このようなクエリのパフォーマンスの実際の違いは、インデックスと両方のクエリを使用しているときです。あなたの質問は、 ullテーブルスキャン。あなたが私に間違っていることを証明するいくつかのテストやドキュメンテーションを提供できるようになるまで、あなたは私から-1を持っています。 –

+1

列に関数やキャストはありません。番号2を参照してください:http://www.simple-talk。 – gbn

+1

'WHERE a = b'が' WHERE b = a'とは異なる言い方で振る舞い、結果が賢明であれば、それはパフォーマンスの面で、それ以外の場合にはそれ以外の場合は、私のお金(SQL Serverのライセンス)を元に戻したい。 –

0

SQL Server

SELECT * FROM Table WHERE convert(date,[timestamp]) = '2003-02-15' 

は、指定した日のすべての行を返す必要があります。

+0

tryこれと結果が表示されます。 – maSTAShuFu

+0

列に関数やキャストはありません。ここ数2を参照してください:http://www.simple-talk.com/sql/t-sql-programming/ten-common-sql-programming-mistakes/ – gbn

+0

ああ!また、すべての機能を削除するようにMicrosoftに指示することもできます。そしてそれを自分でやってください! – maSTAShuFu

0

私はこの場合は、開始日と終了日が同じ

ことができる。これは、12からそのすべての行を確保し、「開始日」と「終了日」

を受け入れるストアドプロシージャを作成します:11:59 PMに01 AMが

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 
0

MS SQL 2014を返され、これは完璧に動作します:

SELECT [YourDateColumn] FROM [YourTable] WHERE(DATEPART(dd,[YourDateColumn]) = '29') 

非常に大きなDBでパフォーマンスの問題が発生する場合があります。

関連する問題