SQL Serverの日時はLIKEを選択しますか?


92

MySQLで

select * from record where register_date like '2009-10-10%'

SQL Serverの構文は何ですか?


実際に何を確認したいですか?特定の日時に特定の日付の部分があること?または、他の何か?
クリスJ

1
これについての健全な議論(DATETIME文字列のような値を扱うのがなぜ悪いのBETWEEN>= AND <=、またはを使用するのが悪いのはなぜかを含む)については、Aaron Bertrandによるこのブログを参照してください。
アーロンベルトラン

あなたの質問は、少なくともlike-operatorタグに5投票しています。sql-like同義語として提案するようにお願いできますか?
Kermit 2013

回答:


138

DATEPART()関数を使用できます

SELECT * FROM record 
WHERE  (DATEPART(yy, register_date) = 2009
AND    DATEPART(mm, register_date) = 10
AND    DATEPART(dd, register_date) = 10)

時間の要素を無視するため、この方法は読みやすく、選択を制限するために翌日の日付を使用する必要はありません。適切なDatePartコードを使用して、句を追加することで、粒度を調整できます。

AND    DATEPART(hh, register_date) = 12)

12と1の間のレコードを取得します。

有効な引数の完全なリストについては、MSDN DATEPARTドキュメントを参照してください。


register_dateにインデックスがある場合、これはインデックスを完全に無視し、パフォーマンスが低下します。おそらくかなりひどい。
クリスJ

わかりましたが、問題の日付の翌日に相当する文字列を使用する問題は回避されます。これは、ここでの回答のいくつかで提案されています。問題の日付が月末または年末である場合はトリッキーです。
Ralph Lavelle、

59

DATETIME変数に対するLIKE演算子の直接サポートはありませんが、いつでもDATETIMEをVARCHARにキャストできます。

SELECT (list of fields) FROM YourTable
WHERE CONVERT(VARCHAR(25), register_date, 126) LIKE '2009-10-10%'

CONVERT関数で使用可能な「スタイル」の完全なリストについては、MSDNドキュメントを確認してください。

マーク


1
合意された-しかし、OPはLIKEと日時を処理する方法を要求した....しかし、私は同意する-より良いアプローチ-日付時刻は、好ましくは、> =と<=あるいはBETWEENのような範囲で処理する必要があります
marc_s

みんなありがとう。すみません、私はSQLの初心者です。
Paisal、2009年

1
MSSQL 2012(私も古いバージョンだと思います)はdatetimeをvarcharに「2014-01-06T16:18:00.045」として変換するので注意してください。
balint 2014年

唯一の選択上記のSQLで私が持っていた発行すると、このです: WHERE CONVERT(VARCHAR(25), register_date, 25) LIKE '2009-10-10%'
ガブリエル・マリウス・ポペスク

10

これを行うと、文字列変換を強制することになります。開始/終了の日付範囲を作成し、以下を使用することをお勧めします。

declare @start datetime, @end datetime
select @start = '2009-10-10', @end = '2009-11-10'
select * from record where register_date >= @start
           and register_date < @end

これによりregister_date、テーブルスキャンではなくインデックス(にインデックスがある場合)を使用できるようになります。


ありがとうございました。すみません、私はSQLの初心者です。
Paisal、2009年

7

CONVERTを使用して、日付をテキスト形式で取得できます。これをvarchar(10)に変換する場合は、次のようにする代わりに=を使用できます。

select *
from record
where CONVERT(VARCHAR(10),register_date,120) = '2009-10-10'

または、上限と下限の日付を使用することもできますが、インデックスを利用できるという利点もあります。

select *
from record
where '2009-10-10' <= register_date
and register_date < '2009-10-11'

where句にタイプミスがあると思います。「where '2009-10-10'> = register_date」
Vishwanath Dalvi

@mr_eclair:そう思わないでください。10月11日以前のすべての日付が含まれます
Andomar

7

残念ながら、「LIKE」を使用してvarcharに対してdatetimeを比較することはできませんが、望ましい出力は別の方法で可能です。

    select * from record where datediff(dd,[record].[register_date],'2009-10-10')=0

3

LIKEを使用して日付を検索可能にするために、変換を使用することもできます。例えば、

select convert(VARCHAR(40),create_date,121) , * from sys.objects where     convert(VARCHAR(40),create_date,121) LIKE '%17:34%'

2

LIKEオペレータは、月や日付などの日付の部分では動作しませんが、DATEPART演算子はありません。

オープン日が1日であるすべてのアカウントを見つけるコマンド:

SELECT * 
  FROM Account 
 WHERE DATEPART(DAY, CAST(OpenDt AS DATE)) = 1`

* CASTING OpenDtは価値があるので、それDATETIMEだけではありませんDATE


1

SQL Serverの日付には、LIKE演算子の非常に不安定なカバレッジがあります。アメリカの日付形式を使用する場合にのみ機能します。例として、あなたは試すことができます:

... WHERE register_date LIKE 'oct 10 2009%'

私はこれをSQL Server 2005でテストしましたが動作しますが、実際にはさまざまな組み合わせを試す必要があります。私が気付いた奇妙なことは次のとおりです。

  • たとえば、「apr 2%」を検索すると、20日の何も表示されず、2番目のフィールドは省略されます。

  • 完全に仕事、例えば、ない単一(ワイルドカード)文字を表現するために「_」シングルアンダースコアを使用しWHERE mydate LIKE 'oct _ 2010%'ますないすべての日付を返す前に、それは実際には、まったく何も返さない- 10日!

  • 形式は厳格なアメリカ式です: ' mmm dd yyyy hh:mm'

いいねのような秒のプロセスを特定するのは難しいので、誰かがこれをもう少し進めたい場合は、ゲストになってください!

お役に立てれば。


1

私はこのスレッドに少し遅れていますが、実際には、MS SQLサーバーでlike演算子が直接サポートされています。

LIKEヘルプに記載されているように、データ型が文字列でない場合は、文字列に変換しようとします。そして、キャスト\変換ドキュメントに記載されているように:

文字列へのデフォルトの日時変換はタイプ0(、100)で、mon dd yyyy hh:miAM(またはPM)です。

DBにこのような日付がある場合:

2015-06-01 11:52:59.057

次のようなクエリを実行します。

select * from wws_invoice where invdate like 'Jun%'
select * from wws_invoice where invdate like 'Jun 1%'
select * from wws_invoice where invdate like 'Jun 1 %'
select * from wws_invoice where invdate like 'Jun 1 2015:%'
select * from wws_invoice where invdate like 'Jun ? 2015%'
...
select * from wws_invoice where invdate like 'Jun 1 2015 11:52AM'

あなたはその行を取得します。

ただし、この日付形式はDateTime2であることを示唆しているため、ドキュメントには次のように記載されています。

21または121-時間、日付、datetime2、およびdatetimeoffsetのデフォルトのODBC正規(ミリ秒)。-yyyy-mm-dd hh:mi:ss.mmm(24h)

それはそれをより簡単にし、あなたは使うことができます:

select * from wws_invoice where invdate like '2015-06-01%'

請求書レコードを取得します。ここにデモコードがあります:

DECLARE @myDates TABLE (myDate DATETIME2);
INSERT INTO @myDates (myDate)
VALUES
('2015-06-01 11:52:59.057'),
('2015-06-01 11:52:59.054'),
('2015-06-01 13:52:59.057'),
('2015-06-01 14:52:59.057');

SELECT * FROM @myDates WHERE myDate LIKE '2015-06-01%';
SELECT * FROM @myDates WHERE myDate LIKE '2015-06-01 11%';
SELECT * FROM @myDates WHERE myDate LIKE '2015-06-01 11:52:59%';
SELECT * FROM @myDates WHERE myDate LIKE '2015-06-01 11:52:59.054%';

文字列に変換せずにSQLサーバーで日時検索を行うと、常に問題が発生します。各日付部分を取得するのはやりすぎです(インデックスを使用することはほとんどありません)。おそらく、文字列変換を使用しない場合のより良い方法は、範囲チェックを使用することです。つまり:

select * from record 
where register_date >= '20091010' and register_date < '20091011';

1

これを試して

SELECT top 10 * from record WHERE  IsActive = 1 and CONVERT(VARCHAR, register_date, 120) LIKE '2020-01%'

0

私はその方法で問題を解決しました。改善のための提案をありがとう。C#の例。

string dd, mm, aa, trc, data;
dd = nData.Text.Substring(0, 2);
mm = nData.Text.Substring(3, 2);
aa = nData.Text.Substring(6, 4);
trc = "-";
data = aa + trc + mm + trc + dd;

"Select * From bdPedidos Where Data Like '%" + data + "%'";
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.