104

MySQLで

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

SQL Serverの構文は何ですか?

4

12 に答える 12

151

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の間に作成されたレコードを取得します。

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

于 2009-10-27T07:01:55.037 に答える
66

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

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

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

マーク

于 2009-10-27T06:37:08.460 に答える
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これにより、テーブルスキャンではなく、インデックス(にインデックスがある場合)を使用できるようになります。

于 2009-10-27T06:37:35.293 に答える
8

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'
于 2009-10-27T06:39:12.383 に答える
7

残念ながら、「LIKE」を使用して日時をvarcharと比較することはできませんが、別の方法で目的の出力を行うことができます。

    select * from record where datediff(dd,[record].[register_date],'2009-10-10')=0
于 2014-06-06T09:30:03.740 に答える
4

これを試して

SELECT top 10 * from record WHERE  IsActive = 1 and CONVERT(VARCHAR, register_date, 120) LIKE '2020-01%'
于 2020-01-14T11:26:01.740 に答える
3

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

select convert(VARCHAR(40),create_date,121) , * from sys.objects where     convert(VARCHAR(40),create_date,121) LIKE '%17:34%'
于 2011-09-21T21:57:02.327 に答える
3

私はこのスレッドに少し遅れていますが、実際にはMSSQLサーバーで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';
于 2018-08-29T13:00:06.060 に答える
2

オペレーターは月や日付などのLIKE日付部分を処理しませんが、DATEPARTオペレーターは処理します。

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

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

* CASTINGOpenDtは、値がでDATETIMEあり、だけではないためですDATE

于 2016-07-07T20:14:19.310 に答える
1

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

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

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

  • 日付内のさまざまなサブフィールドについては、すべてまたはまったく取得されていないようです。たとえば、「apr 2%」を検索すると、20番目の何も取得されません。2番目は省略されます。

  • 単一の(ワイルドカード)文字を表すために単一のアンダースコア'_'を使用しても、完全には機能しません。たとえば、 10日より前のすべての日付が返さWHERE mydate LIKE 'oct _ 2010%'れるわけではなく、実際には何も返されません。

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

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

お役に立てれば。

于 2013-01-09T11:20:48.383 に答える
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 + "%'";
于 2017-02-24T01:56:37.373 に答える
0

これは古い質問だと思いますが、ここでの回答の多くは、ここでSARGableの回答を提供しておらず、パラメーター化についても説明していません。

>=まず、<ロジックを使用する方がはるかに優れています。希望する日付の場合、次のようになります。

SELECT {Your Columns}
FROM dbo.record
WHERE register_date >= '20091010'
  AND register_date < '20091011';

これには、その日の真夜中のストロークを含む2009-10-10のすべての時間値と、2009-10-11より前のナノ秒が含まれます。

DATEADDただし、多くの場合、クエリをパラメータ化するため、代わりに2番目の句に1日を追加することができます。

DECLARE @DateParam date = '20091010';

SELECT {Your Columns}
FROM dbo.record
WHERE register_date >= @DateParam
  AND register_date < DATEADD(DAY,1,@DateParam);

これにより、SARGabilityが維持され、上の任意のインデックスをregister_date使用できるようになります。

于 2021-03-24T12:17:55.550 に答える