-2

これは私にエラーを与えます-

char データ型から datetime データ型への変換により、範囲外の datetime 値が発生しました。

これは機能せず、これも試しましたが、これは月ではなく日付順です

SqlCommand cmd = new SqlCommand("select * from tbl_Member where Email LIKE '" + id.ToString() + "%' ORDER BY YEAR(RegisterDT) DESC,MONTH (RegisterDT) DESC, DAY(RegisterDT) DESC", con);


SqlCommand cmd = new SqlCommand("select * from tbl_Member where Email LIKE '" + id.ToString() + "%' ORDER BY(RegisterDT) DESC", con)
4

2 に答える 2

3

質問を投稿するときは、表の形式、使用しているデータベース、およびサンプル データを提供することをお勧めします。この場合、DAY() および MONTH() 関数を使用しているため、SQL Server を使用していると推測されます。

これらの関数は、文字列ではなく日付を引数として取ります。SQL の暗黙的な変換に依存しないでください。繰り返しましょう。表示されるようなエラーを防ぐために、常に明示的にデータ型を変換する必要があります。

問題は、日付形式がシステムのデフォルト形式ではないことです。たとえば、10/03/2012 のような日付があるとします。アメリカ人が信じているように、これは10月3日ですか?それとも、ヨーロッパ人がそうするように、これは 3 月 10 日ですか? 次に、2012 年 10 月 20 日を考えてみましょう。ヨーロッパ人にとっては圏外です。

したがって、次の 2 つのオプションがあります。

(1) CONVERT() 関数を使用して、明示的な変換を行います。

(2) 文字列関数を使用して月と日を抽出します。上記の場合、これは一方が substring(, 1, 2) で、もう一方が substring(, 4, 2) である可能性があります。

于 2012-05-17T10:39:26.197 に答える
2

私の推測では、RegisterDT は char 列であり、現在の日付設定 (DMY | MDY) に対して無効な日付が含まれていると思います。日付は、文字列ではなく日付として保存する必要があります。これで問題が解決するはずです。

最初のポイントとして、RegisterDT が日付列である場合、なぜそれを年、月、日で分類する必要があるのでしょうか? なぜできないのですORDER BY RegisterDT DESCか?

最後のサイドポイントとして、BEWARE SQL INJECTION . 次のようにパラメーター化されたクエリを使用する必要があります。

SqlCommand cmd = new SqlCommand("SELECT * FROM tbl_Member WHERE Email LIKE @ID + '%' ORDER BY RegisterDT DESC", con);
cmd.Parameters.Add("@ID", SqlDbType.Varchar).Value = id.ToString();

これにより、SQL インジェクションが排除されるだけでなく、SQL を値から分離することでコードが読みやすくなり、文字列変換によるデータ損失が防止されます。

于 2012-05-17T10:40:10.490 に答える