質問: c#でSQL serverのテーブルにデータを登録する処理を作成中です。 登録の際にファイルから読み込んだ日時とDateTime型の列に秒まで指定して登録しますが、再び同じ日時のデータを登録する場合は日時をキーにUpdateしたいです。 しかし、SQL serverでの日時の比較時にCONVERT関数を利用するとインデックスがきかなくなるということなので、このような場合は日時をDatetime型ではなくvarchar等の文字列で登録するほうが良いのではと考えております。 Datetime型と文字列の日時をインデックスが有効になる形で一致検索する方法はありますでしょうか? このあたり何かノウハウがありましたらご教示頂きたく宜しくお願いいたします。
回答: `CONVERT`関数を使用すれば効率的な検索ができなくなるのは当然の結果です。しかし日時をキーに検索するだけであれば`DATEADD`関数を使って ``` WHERE @inputdate <= DatetimeColumn AND DatetimeColumn < DATEADD(minute, 1, @inputdate) ``` のように必要な範囲を指定すれば効率的に検索できます。 そもそも`smalldatetime`型を使えば4バイトで済む内容です。`varchar`型を使用する場合`2018/12/14 08:11:00`と格納するつもりでしょうか、この場合19+2バイト必要になります。更にC#から文字列を扱う場合すべてUnicodeとなるため、Unicode→MBCS変換も発生します。`nvarchar`型を使えば変換は排除できますが、今度は38+2バイトに膨れ上がります。いずれにしても大量のデータを登録するのであればこの差は非常に大きな問題となります。 また「インデックスが効かない」という表現も不明確です。`CONVERT`関数を使用したとしても参照するカラムが適切であればインデックスは常に有効です。