2012-12-29 34 views
0

我在哪里注册一些信息到那里我有一列(日期时间)的数据库的应用程序。在这一列中,我从DateTimePicker插入日期。如何根据从组合框中选择的月份和年份在数据库中进行搜索?

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

+0

在sqlserver中检查'datepart' –

回答

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

与(searchDate)你是指我的sql数据库中的列名?是对的吗? –

+0

是的,用您的表名和searchDate替换

并输入您的日期字段名称 – Sparky

0

像这样的事情

Select * from tablename where datepart(mm,datecolumnname)[email protected] nd datepart(yyyy,datecolumnname)[email protected]

+0

您的组合框值是否正确参数化? –

+0

@robert harvey - 我同意perevent frm sql注入必须使用参数化查询。 –

1

其中使用两datepartmonthyear功能所有溶液使它不可能为服务器通过使用索引来优化查询。

唯一在性能方面有效的解决方案是使用between子句@Sparkys第二种方法。他还介绍了时间分数出现的问题。这就是为什么我宁愿使用简单的date列(而不是datetime)。然后,你可以使用datetime列并在今年和午夜仍然得到丢弃的最后一秒钟后

between '20121201' and '20121231 23:59:59' 

一切的范围内时,因为写

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

。虽然这不太可能,但在技术上不正确。

@Nicarus建议拓宽结束时间23:59:59997' 。这似乎是工作,但是是“丑陋”(但是,跆拳道,它的作品!)

1

确保你把它们在SQL查询之前存储在你的C#组合值到整型变量。正如其他人所暗示的,如果允许将直接用户输入放入SQL字符串中,则SQL注入攻击是可能的。

假设你有2个INT变量 “intMonth”, “intYear” 和 “dateFieldname” 的字段名,下面的SQL应该工作。

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