dateTime型の列を持つテーブルがあります。その日に実行されるすべての行を選択するクエリを実行する必要があります。基本的には、SELECT WHERE Date =日
SELECT * FROM Table
WHERE [timeStamp] = '02-15-2003'
しかし、唯一の[タイムスタンプ] '02 -15-2003 00である行を返す:00:00.000' を、本当に私はその日いつでもから行をしたいです。 SQL Serverの2008 +で
dateTime型の列を持つテーブルがあります。その日に実行されるすべての行を選択するクエリを実行する必要があります。基本的には、SELECT WHERE Date =日
SELECT * FROM Table
WHERE [timeStamp] = '02-15-2003'
しかし、唯一の[タイムスタンプ] '02 -15-2003 00である行を返す:00:00.000' を、本当に私はその日いつでもから行をしたいです。 SQL Serverの2008 +で
あなたはインデックスを持っている場合は、あなたが使用しているから、インデックスを妨げるものではない何かをしたいとしている。
SELECT *
FROM Table
WHERE [timeStamp] >= '20030215'
AND [timeStamp] < '20030216'
あなたはいつでも部分を取り除くために[timeStamp]
列に切り捨て操作を行うことができます(実装に依存する)が、これは潜在的に実行計画を傷つける可能性がある。あいにく、オプティマイザがいくつかの関数について巧妙で、時にはそうでない場合があるので、実際にはこれを見るために実行計画を見なければなりません。
フーラ!ついに正しい答えが1つ。そして、dba.seでここに参加することを考えましたか? http://chat.stackexchange.com/rooms/179/the-heap – gbn
'mm-dd-yyyy'は言語/地域では安全ではありません。私はOPが使用していることを知っていますが、おそらくちょうどナッジが必要です。 –
@Aaron Bertrandもし 'BETWEEN'が' [] 'のみを扱うので、' datecol WITHIN [lower、upper] 'のような様々なオープン/クローズ区間を簡単に扱えるものがあれば、それは大好きです。 –
:
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'
カラムに関数やキャストは必要ありません。ここで2番の数字を参照してください:http://www.simple-talk.com/sql/t-sql-programming/ten-common-sql-programming-mistakes/ – gbn
@gbn DATEへの変換は実際に使用されていますが、すべての型変換には当てはまらないことに注意してください。 –
あなたがしている場合は、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句のデータ型を変更するのは、最も簡単な解決策ですが、有界検索では使用できないインデックスの使用に影響します。
日付の比較は難しいことがあります。
これは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
後者はない前者は内部効率に干渉しないよりもはるかに良好であることに注意します。
私はこれをテストして間違っています。あなたのバージョンでは、Cade Rouxとmattmc3が提供する回答の2倍の時間がかかります。このようなクエリのパフォーマンスの実際の違いは、インデックスと両方のクエリを使用しているときです。あなたの質問は、 ullテーブルスキャン。あなたが私に間違っていることを証明するいくつかのテストやドキュメンテーションを提供できるようになるまで、あなたは私から-1を持っています。 –
列に関数やキャストはありません。番号2を参照してください:http://www.simple-talk。 – gbn
'WHERE a = b'が' WHERE b = a'とは異なる言い方で振る舞い、結果が賢明であれば、それはパフォーマンスの面で、それ以外の場合にはそれ以外の場合は、私のお金(SQL Serverのライセンス)を元に戻したい。 –
SQL Server
SELECT * FROM Table WHERE convert(date,[timestamp]) = '2003-02-15'
は、指定した日のすべての行を返す必要があります。
tryこれと結果が表示されます。 – maSTAShuFu
列に関数やキャストはありません。ここ数2を参照してください:http://www.simple-talk.com/sql/t-sql-programming/ten-common-sql-programming-mistakes/ – gbn
ああ!また、すべての機能を削除するようにMicrosoftに指示することもできます。そしてそれを自分でやってください! – maSTAShuFu
私はこの場合は、開始日と終了日が同じ
ことができる。これは、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
MS SQL 2014を返され、これは完璧に動作します:
SELECT [YourDateColumn] FROM [YourTable] WHERE(DATEPART(dd,[YourDateColumn]) = '29')
非常に大きなDBでパフォーマンスの問題が発生する場合があります。
あなたはどのデータベースを使用していますか? SQLサーバー?オラクル? PostgreSQL? –
SQL Server 2008 –
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 –