【问题标题】:How to Search in the database according to Month and Year chosen from Combo Boxes?如何根据从组合框中选择的月份和年份在数据库中搜索?
【发布时间】:2012-12-29 19:32:27
【问题描述】:

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

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

【问题讨论】:

  • 在sqlserver中检查`datepart`

标签: c# sql sql-server-2008


【解决方案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

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

【讨论】:

  • 参数化是否正确?
  • with (searchDate) 你的意思是我的sql数据库中的列名?对吗?
  • 是的,将 替换为您的表格名称,并将 searchDate 替换为您的日期字段名称
  • 如果您使用BETWEEN,请注意它确实考虑了时间,因此它会显示为独占。例如,searchDate BETWEEN '1/1/2013' AND '1/31/2013' 将仅包含 searchDate 从“1/1/2013”​​到完全“1/31/2013 00:00:00.000”的数据。
  • @Sparky - 此外,根据日期时间格式,“23:59:59”可能还不够——您需要“23:59:59.997”
【解决方案2】:

使用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,它有效!)

【讨论】:

    【解决方案3】:

    确保将组合值存储到 C# 中的整数变量中,然后再将它们放入 SQL 查询中。正如其他人所暗示的那样,如果您允许将直接用户输入放置在 SQL 字符串中,那么 SQL 注入攻击是可能的。

    假设您有 2 个 int 变量“intMonth”、“intYear”和“dateFieldname”的字段名称,下面的 SQL 应该可以工作。

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

    【讨论】:

      【解决方案4】:

      类似的东西

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

      【讨论】:

      • 你的组合框值参数化了吗?
      • @robert harvey - 我同意 perevent frm sql 注入必须使用参数化查询。
      猜你喜欢
      • 1970-01-01
      • 2018-01-23
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      • 2018-03-02
      • 2020-11-21
      相关资源
      最近更新 更多