2017-10-26 24 views
0

日付フィールドの値が「dd/MM/yyyy」の形式でvarcharとして保存されているテーブルフィールドと比較する必要がありますが、比較に失敗します。例外がありますC#SQL Serverと文字列の比較

文字列から日付や時刻を変換すると変換に失敗しました。

string sql = "select * from TB_RICHIESTE where CONVERT(DATE, Date) <= CONVERT(DATE, '" + dateFormat + "')"; 

しかし、私はこのexcpetionを持っている: は、私は私がこの

string dateFormat = date.ToString("dd/MM/yyyy"); 

のように、nstringし、このようなクエリを書く比較する日付を変換してみました。誰かが私を助けることができますか?ありがとう

+6

* *しないでください。フィールド*および*には適切なタイプを使用してください。また、文字列を連結してSQL文を構成しないでください。パラメータ化されたクエリを使用する –

+0

*テーブル*に 'dd/MM/yyyy'という形式の日付がある場合、非常に深刻なバグがあります。フィールドの型は 'date'に修正する必要があります。このようなフィールドでソートすることも、日付範囲を検索することもできません。例えば、特定の日付より後の日付 –

答えて

5

まず、あなたは文字列として日付を保存すべきではありません。
Panagiotis Kanavosがコメントに書いたとおり、これは深刻なバグです。そのような列で並べ替えることはできません。日付範囲を検索することはできません。最も重要なのは、誰かが無効な値を入力した場合は制御できません。誰かがその列に「Alfredo」を入力するのを止めることはありません。
詳細については、Aaron BertrandのBad habits to kick : choosing the wrong data typeを参照してください。

第2に、.NetからSqlサーバーに日付を文字列として渡すべきではありません。 DateTimeのインスタンスをパラメータとして渡す必要があります。 .Net DateTimemaps directlyとSQL ServerのDate

カラムのデータ型を変更できない場合は、少なくともconvert style(あなたの場合は103)を使用して日付に変換することができます。ここで

がそれを行うには良い方法です:

var sql = "select * from TB_RICHIESTE where CONVERT(DATE, [Date], 103) <= @Date"; 

その後、あなたはSqlCommand@Dateパラメータを追加します。

com.Parameters.Add("@Date", SqlDbType.Date).Value = date.Date; 
+0

少し上手く: '... .Value = date.Date;'。それはデータベースの型が(またはなる) 'DateTime'であっても機能します。 –

+0

@TimSchmelter私は既に列のデータ型を 'Date'に変換しています。また、パラメータのデータ型も' Date'です。私は単に 'date'の代わりに' date.Date'を送ることで何が変わるのか分かりません。 –

+0

完璧なソリューション。ありがとう –

0

使用パラメータの日付値を渡すために@Zohar Peled postを参照してください。これは、日付値を処理する適切なメソッドです。 または 日付の値をISO形式で渡すことができます。以下のコードを参照してください。

string dateFormat = date.ToString("yyyy/MM/dd"); 


string sql = "select * from TB_RICHIESTE where CONVERT(DATE, Date) <= CONVERT(DATE, '" + dateFormat + "')"; 
+0

まず、これはISO形式ではありません。日付に文字列リテラルを渡す必要がある場合は、 'yyyy-mm-dd'またはそれ以上の場合は' yyyymmdd'を使用します。 第2に、文字列をSQL文に連結することは危険です。これは、SQL Injection攻撃のための扉です。ここには当てはまらないかもしれませんが、文字列を連結する代わりにパラメータを使用する方が常に良いです。 –

+0

実際のISOまたは分離されていない書式が使用されている場合、*パラメータ*を変換する理由はありません。 *フィールド*を変換することは、データベースがインデックスを使用してテーブルスキャンを実行するのを防ぐという悪い考えです –