列 (DateTime) があるデータベースに情報を登録するアプリケーションがあります。この列には、DateTimePicker からの日付を挿入します。
ここで、コンボボックスから選択した日付に従って検索する検索ボタンを作成したいと思います...しかし、このコンボボックスでは、月と年を選択するオプションを1つだけ残しました...に従ってすべての情報を選択するSELECTクエリを作成するにはどうすればよいですかComboBoxes から選択された月と年に?
列 (DateTime) があるデータベースに情報を登録するアプリケーションがあります。この列には、DateTimePicker からの日付を挿入します。
ここで、コンボボックスから選択した日付に従って検索する検索ボタンを作成したいと思います...しかし、このコンボボックスでは、月と年を選択するオプションを1つだけ残しました...に従ってすべての情報を選択するSELECTクエリを作成するにはどうすればよいですかComboBoxes から選択された月と年に?
datepart
ormonth
およびand関数のいずれかを使用するすべてのソリューションではyear
、サーバーがインデックスを使用してクエリを最適化することはできません。
パフォーマンスの観点から有効な唯一の解決策は、この句を使用した@Sparkysの2番目のアプローチbetween
です。彼はまた、時間の分数で発生する問題についても説明しました。そのため、(の代わりに)プレーンdate
列を使用することをお勧めしますdatetime
。その後、あなたは書くことができます
select *
from YourTable
where DateColumn between <FirstDayOfSelectedMonthAndYear>
and <LastDayOfSelectedMonthAndYear>
日時列との範囲を使用する場合
between '20121201' and '20121231 23:59:59'
年の最後の1秒以降と真夜中以降はすべて破棄されます。可能性は非常に低いですが、技術的には正しくありません。
@Nicarusは、終了時間を23:59:59,997'に拡大することを提案しています。これは機能しているように見えますが、「醜い」です(しかし、wtf、機能します!)
コンボ値を SQL クエリに入れる前に、C# の整数変数に格納してください。他の人がほのめかしたように、直接のユーザー入力を SQL 文字列内に配置できるようにすると、SQL インジェクション攻撃が可能になります。
2 つの int 変数 "intMonth"、"intYear"、およびフィールド名 "dateFieldname" があると仮定すると、次の SQL が機能するはずです。
SELECT *
FROM [table]
WHERE datepart[mm,dateFieldname] = intMonth
AND datepart[yyy,dateFieldname] = intYear
select * from <table>
where month(searchDate)=Month_from_box and Year(searchDate)=Year_from_box
ただし、データのサイズによっては、これが最速の方法ではない場合があります。データが100行または1000行にある場合、このアプローチは問題ない可能性があります...
別のアプローチは、入力から C# で開始日と終了日を作成し、範囲検索を実行することです。
select * from <table>
where searchDate between Start_date_from_C# and End_Date_from_C#
そのアプローチを行う場合は、必ず時間部分を考慮して、最初の日付を 0 にし、終了日を 23:59:59 にしてください。
日付フィールドにインデックスがある場合、2 番目のアプローチの方が高速です...
このようなもの
Select * from tablename where
datepart(mm,datecolumnname)=@cmboxMonthvalue nd datepart(yyyy,datecolumnname)=@ComboboxYearvalue