0

列 (DateTime) があるデータベースに情報を登録するアプリケーションがあります。この列には、DateTimePicker からの日付を挿入します。

ここで、コンボボックスから選択した日付に従って検索する検索ボタンを作成したいと思います...しかし、このコンボボックスでは、月と年を選択するオプションを1つだけ残しました...に従ってすべての情報を選択するSELECTクエリを作成するにはどうすればよいですかComboBoxes から選択された月と年に?

4

4 に答える 4

1

datepartormonthおよび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、機能します!)

于 2012-12-29T19:56:47.240 に答える
1

コンボ値を SQL クエリに入れる前に、C# の整数変数に格納してください。他の人がほのめかしたように、直接のユーザー入力を SQL 文字列内に配置できるようにすると、SQL インジェクション攻撃が可能になります。

2 つの int 変数 "intMonth"、"intYear"、およびフィールド名 "dateFieldname" があると仮定すると、次の SQL が機能するはずです。

SELECT  *
FROM    [table]
WHERE   datepart[mm,dateFieldname] = intMonth
    AND datepart[yyy,dateFieldname] = intYear
于 2012-12-29T20:06:10.270 に答える
1
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 番目のアプローチの方が高速です...

于 2012-12-29T19:41:00.867 に答える
0

このようなもの

Select * from tablename where datepart(mm,datecolumnname)=@cmboxMonthvalue nd datepart(yyyy,datecolumnname)=@ComboboxYearvalue

于 2012-12-29T19:46:02.107 に答える