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

本文关键字:搜索 数据库 选择 何根 组合 | 更新日期: 2023-09-27 17:49:48

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

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

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

select * from <table>
where month(searchDate)=Month_from_box and Year(searchDate)=Year_from_box

然而,根据数据的大小,这可能不是最快的方法。如果您的数据在100或甚至1000行,这种方法可能是OK的…

另一种方法是在c#中根据输入构建开始和结束日期,然后执行范围搜索

select * from <table>
where searchDate between Start_date_from_C# and End_Date_from_C#

如果你采用这种方法,一定要考虑时间部分,在第一次约会中设置为0,在结束日期中设置为23:59:59

如果您在日期字段上有索引,第二种方法将更快…

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

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

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

因为当使用datetime列和

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

在一年的最后一秒和午夜之后的所有东西仍然被丢弃。虽然在技术上不太可能是不正确的。

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

确保在将组合值放入SQL查询之前将它们存储在c#中的Integer变量中。正如其他人所暗示的那样,如果允许将直接用户输入放置在SQL字符串中,则可能发生SQL注入攻击。

假设您有两个int变量"intMonth","intYear"和字段名"dateFieldname",下面的SQL应该工作。

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

像这样

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