【问题标题】:How to select month for datatype "date"?如何为数据类型“日期”选择月份?
【发布时间】:2012-04-12 19:35:25
【问题描述】:

我正在用 C# 编写一个程序,我可以在其中按年和月选择数据并将其放入 dataGridView 中。年份部分很简单。我从组合框中选择年份并执行以下查询:

"SELECT * FROM table WHERE YEAR(date) = '" + year_comboBox.Text + "'";

因为数据库中的年份格式是 2010、2011、2012 等等,所以一切正常。但是当谈到月份时,它们在我的组合框中,如 1 月、2 月、3 月等,它们在数据库中的格式是 01、02、03 等。所以我需要不同类型的查询,或者我需要编写更多代码,以便我可以将一月、二月和其他月份的字符串转换为 01、02 等等,这并不是真正的代码效率。

那么有没有一种简单类型的查询,我可以在不输入转换月份字符串的情况下完成这项工作?

【问题讨论】:

  • 注意 sql 注入。 xkcd.com/327
  • 您应该使用参数化查询来防止 SQL 注入。下面是如何在 C# 中执行此操作的示例:dotnetperls.com/sqlparameter 作为一个示例,说明您遇到的问题是什么,我可以在年份框中输入 '; drop table table;-- 并造成严重破坏。

标签: c# sql-server


【解决方案1】:

您可以使用DateTime.ParseExact 方法将月份名称作为字符串转换为日期时间:

var monthString = DateTime.ParseExact("April", "MMMM", System.Globalization.CultureInfo.InvariantCulture).Month.ToString("00");

上面的代码会将“04”分配给monthString

【讨论】:

    【解决方案2】:

    我认为您可以修改您的组合框,以便除了一月、二月、三月等的文本之外,每条记录还有一个 1、2、3 等。然后,您可以将该值传递给 SQL 以在您的月份查询中使用。

    (我可能错了,并且将组合框与下拉列表混淆了。但是在您的年份测试中,您注意到您使用的是year_comboBox.Text。如果有类似的Value 字段,请使用它来设置月份值.)

    【讨论】:

      【解决方案3】:
      string query = @"SELECT * FROM table WHERE MONTH(date) = '" +  DATEPART(mm,CAST(month_combobox+ ' 1900' AS DATETIME)) + "'";
      

      使用 DatePart,您可以从数字中获取月份名称。 (不确定 ' 或 " )

      【讨论】:

        猜你喜欢
        • 2018-09-04
        • 1970-01-01
        • 2012-07-29
        • 2016-08-26
        • 2019-11-09
        • 2021-10-29
        • 1970-01-01
        • 2017-07-19
        • 1970-01-01
        相关资源
        最近更新 更多