web-dev-qa-db-ja.com

SQL Serverの日付時刻のような選択?

mySQLで

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

SQL Serverの構文は何ですか?

85
Paisal

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 docs を参照してください。

128
Ralph Lavelle

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

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

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

マーク

54
marc_s

それを行うと、文字列変換を強制的に実行します。開始/終了の日付範囲を構築し、使用することをお勧めします:

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にインデックスがある場合)を使用できます。

10
Marc Gravell

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'
7
Andomar

残念ながら、 'LIKE'を使用してdatetimeをvarcharと比較することはできませんが、目的の出力は別の方法で可能です。

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

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

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

LIKE演算子は月や日付などの日付部分では機能しませんが、DATEPART演算子では機能します。

オープン日が1日であったすべてのアカウントを検索するコマンド:

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

* CASTING OpenDtは、その値がDATETIMEだけでなくDATEにあるためです。

2
Mohit Sarin

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

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

文字列へのデフォルトの日時変換は、タイプ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-ODBC正規の(ミリ秒で)デフォルトの時刻、日付、datetime2、およびdatetimeoffset。 -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
Cetin Basoz

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

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

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

  • たとえば、「apr 2%」を検索した場合、20代のみが取得され、2番目は省略されます。

  • 単一の下線「_」を使用して単一の(ワイルドカード)文字を表すことは完全には機能しません。たとえば、WHERE mydate LIKE 'oct _ 2010%'notすべての日付を返しますbefore10番目-実際には何も返しません!

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

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

お役に立てれば。

1
Paul

そのようにして問題を解決しました。改善のための提案をありがとう。 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 + "%'";
0