2016-05-13 16 views
0

私の$ data入力に基づいてデータベース内の日付を動的に検索したいとします。DATETIMEとLIKEを使用して動的検索を行うSQL

日付は日付として保存され、通常は「2016-05-11」のように表示されます。 MySQLのDBで

私の句た:

Select * From Table WHERE (Table.date LIKE '$data%') 

ユーザーが「20」に入った場合、ユーザは、「2016から05」の結果は意志に入るので、もし結果が20で始まるすべての日付になります私の検索が完全に機能するように、2016年から始まるすべての日付にしてください。

Sql Server 2008を介して展開する場合、私は2つのことを実現しました。

1)私はこのような

Select * From Table WHERE (Table.date LIKE '%$data$%') 

としてLIKE関数を使用する場合関数は、「2016」の値のために働くだろうが、「2016-」の値が入力されたときに0の結果を返すことになります。

2)私は$データ= 2016しかしはゼロの値が返されたときに正しい値が返されるよう

Select * From Table WHERE (DATEPART(year, Table.date) LIKE(OR)= '$data') 

関数として関数DATETIMEを使用する場合場合$データ=「201」は、例えば、故に動的ではありません。

私は間違っていますか?

+0

入力の検証に問題があります。ユーザーが '20 'を入力できる場合、' 'fred'または' 2016-02-30'を入力することもできます。 –

+0

Imはajaxコールを使用しているので、Fredと入力します。彼らは結果を得ることはありません。それは問題ではありませんか?私は正しくないのですか? – MakDo

答えて

0

暗黙の変換は、悪い、悪い、悪いです - SQLまたは他の多くのプログラミング言語です。

LIKEが文字列に作用します。文字列を操作する場合は、を明示的にに設定してください。これは、MySQLとSQL Serverに当てはまります。あなたは年にLIKEを使用したい場合は

、その後、DATENAME()はなくDATEPART()使用:

WHERE DATENAME(year, Table.date) LIKE '$data' 

しかし、私はそのような日付範囲として日付に基づく構築物を、使用して日付を考えることをお勧めします。

+0

しかし、私の入力は文字列です!私は、YYYY-MM-DD文字列を入力するよう明示的にユーザーに指示し、それに応じて検索が行われます。だからそれは問題ではありません! – MakDo

+1

日付によって検索されるほとんどすべてのアプリケーションは、日付範囲を使用します。何とか他の誰も考えていなかった(疑わしい)日付を検索するための良い方法を見つけたとしても、それは人々の期待です。私が航空会社の予約ウェブサイトに行って、日付で検索したいとき、私は6月にフライトを検索するために "2016-06-"を入れることを期待していません。また、2016-05-18と2016-05-21の間の日付を検索するにはどうすればよいですか? @MakDo。 –

+1

。 。 。 * date_format()またはconvert()を使用して*明示的に日付値を文字列に変換します。これらのメソッドはすべて、索引の使用を排除します。暗黙的な変換や関数呼び出しは、一般的に索引の使用を妨害します。 –

0

私はちょうど私の愚かな間違いを認識しました。 DATEPARTを使用してLIKE句にワイルドカードを追加する必要がありました。

*表から選択WHERE(DATEPART(year、Table.date)LIKE = '$ data%')。

完全に動作します。

しかし、私は$データをYYYY、MM、DDに分割し、各要素をテストすることを簡単にするための他の提案が大好きです。

0

私はTable.dateを自由に操作するように努力するので、インデックスが使用されます。

代わりに、あなたが不足している部品を追加することによって、日付範囲に検索パラメータを変換するCASE表現を使用することができます。

下限:

CASE LENGTH($data) 
WHEN 8 THEN $data + '01' 
WHEN 7 THEN $data + '-01' 
WHEN 5 THEN $data + '01-01' 
WHEN 4 THEN $data + '-01-01' 
ELSE $data 
END 

上限:

CASE LENGTH($data) 
WHEN 8 THEN DATEADD(MONTH,$data + '01',1) 
WHEN 7 THEN DATEADD(MONTH,$data + '-01',1) 
WHEN 5 THEN DATEADD(YEAR,$data + '01-01') 
WHEN 4 THEN DATEADD(YEAR,$data + '-01-01') 
ELSE DATEADD(DAY,$data,1) 
END 
関連する問題