1

クエリ:

SELECT sv_inquiry.inquiry_id, sv_inquiry.owner_rep, sv_inquiry.status
      ,sv_inquiry.owner_rep, sv_inquiry.closed_dt 
FROM sv_inquiry 
WHERE sv_inquiry.typ = 'incident' 
     AND sv_inquiry.status = 'resolved' 
     AND sv_inquiry.owner_grp = 'service center NL & INT' 
     AND sv_inquiry.closed_dt LIKE '%17-6-2013%' 
ORDER BY sv_inquiry.inquiry_id DESC

問題:

このクエリは、" " を省略しない限り空の結果セットを返しますが、" AND sv_inquiry.closed_dt LIKE '%17-6-2013%'" を省略した場合は、過去 2 年間の結果がすべて取得され、特定の日付の結果のみが必要になります。

sv_inquiry.closed_dt is a field of the DATETIME type.

おそらくCASTまたはCONVERTの使用を実装する必要がありますが、それを含めて特定の日付の結果のみを表示するようにクエリを調整する方法はわかりません。

(クエリは PHP サイトでSQLSRV_QUERYステートメントを使用して使用されます)

sv_inquiry.closed_dtフィールドで特定の日付を検索できるように、誰かがクエリを調整できますか?

4

5 に答える 5

3

日付にキャストして比較するだけです。SQL Server 2008 以降で使用できます。

AND CAST(sv_inquiry.closed_dt AS DATE) = '2013-06-17'
于 2013-06-17T12:35:44.673 に答える
1

日時値を文字列リテラルと比較しようとしています。そのために、SQL Server は、列の照合順序を使用して datetime 値を文字列に変換するか、その形式を判別できる場合は文字列を datetime に変換する必要があります。'17-6-2013' は認識可能な形式ではないため、SQL Server はdt_closed比較する前に値を文字列に変換します。

「2013-6-17」も安全なオプションではありません。これは、DATEFORMAT プロパティの影響を受けない形式の 1 つですが、照合の影響を受けます。

唯一の安全な形式は、分離されていない ISO 8601 形式の '20130617' です。

パラメーター化された SQL ステートメントを使用して変換の問題全体をバイパスし、フィルター値を日付パラメーターとして渡すことができます。

もう 1 つの問題は、列に何らかの関数を適用するdt_closedと、クエリ オプティマイザーが dt_closed で定義されたインデックスを無視し、テーブル スキャンを強制することです。

より良い解決策は、例えばを使用して等値演算を範囲クエリに変換することBETWEENです。

AND sv_inquiry.closed_time between '20130617' AND '20130618'

これにより、文字列への変換が回避され、基礎となるインデックスが利用されます

于 2013-06-17T12:46:04.733 に答える
1

交換

AND sv_inquiry.closed_dt LIKE '%17-6-2013%'

AND DATEADD(dd, 0, DATEDIFF(dd, 0, sv_inquiry.closed_dt)) = '2013-06-17'

SQLFiddle デモ

これがインデックスを使用しないという問題を克服するには、datetime列を別々の列に分割することをお勧めします:datetimeのようsv_inquiry.closed_datesv_inquiry.closed_time.

于 2013-06-17T12:17:05.780 に答える
0

交換

AND sv_inquiry.closed_dt LIKE '%17-6-2013%'

AND convert(varchar(10),sv_inquiry.closed_dt, 121) = '2013-06-17'

これにより、フォーマットを使用して日時が varchar にキャストされます121。長さが 10 文字に制限されているため、datepart のみが返されます。

または、使用できます

AND convert(varchar(100),sv_inquiry.closed_dt, 121) like '2013-06-17%'

時間などを動的に確認する必要がある場合もあります。

于 2013-06-17T12:33:15.800 に答える
0
 SELECT sv_inquiry.inquiry_id, sv_inquiry.owner_rep, sv_inquiry.status
  ,sv_inquiry.owner_rep, sv_inquiry.closed_dt 
 FROM sv_inquiry 
  WHERE sv_inquiry.typ = 'incident' 
 AND sv_inquiry.status = 'resolved' 
 AND sv_inquiry.owner_grp = 'service center NL & INT' 
 AND sv_inquiry.closed_dt ='2013-6-17'
 order BY sv_inquiry.inquiry_id DESC
于 2013-06-17T12:36:38.417 に答える