如何根据从组合框中选择的月份和年份在数据库中进行搜索?

时间:2012-12-29 19:32:27

标签: c# sql sql-server-2008

我有一个应用程序,我将一些信息注册到我有一个Column(DateTime)的数据库中。在此列中,我从DateTimePicker插入日期。

现在我想创建一个搜索按钮,根据从Comboboxes中选择的日期进行搜索...但是在这个Comboboxes中我只留下一个选项,选择MONTH和YEAR ...如何选择SELECT查询根据从组合框中选择的月份和年份的所有信息?

4 个答案:

答案 0 :(得分: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

如果你在日期字段上有索引,第二种方法会更快......

答案 1 :(得分:1)

使用datepartmonthyear函数的所有解决方案都使服务器无法使用索引优化查询。

在性能方面唯一有效的解决方案是使用between子句的@Sparkys第二种方法。他还描述了时间分数引起的问题。这就是为什么我更喜欢使用普通的date列(而不是datetime)。然后你可以写

select * 
from YourTable 
where DateColumn between <FirstDayOfSelectedMonthAndYear> 
                     and <LastDayOfSelectedMonthAndYear>

因为使用日期时间列和

的范围
between '20121201' and '20121231 23:59:59'

一年中最后一秒和午夜之后的一切仍然被丢弃。虽然技术上不太可能是不正确的。

@Nicarus建议将结束时间扩大到23:59:59,997'。这似乎有效,但是“丑陋”(但是,wtf,它有效!)

答案 2 :(得分:1)

确保将组合值存储到C#中的Integer变量中,然后再将它们放入SQL查询中。正如其他人所提到的,如果允许将直接用户输入放在SQL String中,则可以进行SQL注入攻击。

假设您有2个int变量“intMonth”,“intYear”和字段名“dateFieldname”,则以下SQL应该有效。

SELECT  *
FROM    [table]
WHERE   datepart[mm,dateFieldname] = intMonth
    AND datepart[yyy,dateFieldname] = intYear

答案 3 :(得分:0)

像这样的东西

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