我有一个应用程序,我将一些信息注册到我有一个列(日期时间)的数据库中。在此列中,我从 DateTimePicker 插入日期。
现在我想创建一个搜索按钮,根据从组合框中选择的日期进行搜索...但是在这个组合框中我只留下了一个选项,选择 MONTH 和 YEAR...我如何进行 SELECT 查询来选择所有信息到从组合框中选择的月份和年份?
我有一个应用程序,我将一些信息注册到我有一个列(日期时间)的数据库中。在此列中,我从 DateTimePicker 插入日期。
现在我想创建一个搜索按钮,根据从组合框中选择的日期进行搜索...但是在这个组合框中我只留下了一个选项,选择 MONTH 和 YEAR...我如何进行 SELECT 查询来选择所有信息到从组合框中选择的月份和年份?
所有使用datepart
ormonth
和year
函数的解决方案都使服务器无法使用索引来优化查询。
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,它有效!)
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
如果您在日期字段上有索引,则第二种方法会更快......
确保将组合值存储到 C# 中的整数变量中,然后再将它们放入 SQL 查询中。正如其他人所暗示的那样,如果您允许将直接用户输入放置在 SQL 字符串中,则 SQL 注入攻击是可能的。
假设您有 2 个 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