【问题标题】:Filter datatable between two dates过滤两个日期之间的数据表
【发布时间】:2013-05-23 11:00:23
【问题描述】:

我的数据库中有一个名为“月”的列。我想做的是在两个月之间过滤表格。这方面的例子是 3 月 - 6 月。我有代码可以工作,但只能按字母顺序工作

string strquery = "select * from tbl_DR_data ";
string strq2 = "where";

if (DropDownList6.SelectedItem.Text != "All" && DropDownList8.SelectedItem.Text != "All") {
    string month1 = DropDownList6.SelectedItem.Text.ToString();
    string month2 = DropDownList8.SelectedItem.Text.ToString();
    strq2 = strq2 + "[Month] BETWEEN'" + month1 + "'AND'" + month2 + "'";
}

DropDownList6 = MarchDropDownList8 = June 时。网格视图中没有任何内容出现在我绑定但如果交换它们所以 DDL6= June 和 DDL8 = March 它可以工作:S

有没有办法让我可以按照月份的顺序而不是按字母顺序排列月份

【问题讨论】:

  • 你的数据库中“月”列的数据类型是什么??
  • 这似乎是错误的设计。您应该使用整数来表示月份。
  • @watraplion 是 varchar(25)。我也根本不是创建数据库的人
  • 您可以通过使用CASE WHEN Month='Jan' THEN 1 WHEN Month='Feb' THEN 2 etc. 之类的东西来解决这个问题,只要您将月份指定为字符串。请注意,这将是很多打字:-)
  • @astander 这就是我现在的想法,因为它会好很多

标签: c# asp.net sql datatable


【解决方案1】:

为什么你真的将月份作为字符串存储在数据库中?,如果你遵循这条路,相信我,你甚至会遇到更严重的问题,而且调试起来会很麻烦。您始终可以从任何日期或日期时间列值中获取月份部分。

【讨论】:

    【解决方案2】:

    试试这个代码,希望这是你所期望的

    SET @FromMonth = 'March'
    SET @ToMonth = 'June'
    SELECT 
      * 
    FROM 
      tbl_DR_data
    WHERE
       DATEPART(mm,CAST([Month]+ ' 1900' AS DATETIME)) >= DATEPART(mm,CAST(@FromMonth+ ' 1900' AS DATETIME))
       AND DATEPART(mm,CAST([Month]+ ' 1900' AS DATETIME)) <= DATEPART(mm,CAST(@ToMonth+ ' 1900' AS DATETIME))
    

    【讨论】:

      【解决方案3】:

      This is the MSDN Syntax for BETWEEN

      test_expression [ NOT ] BETWEEN begin_expression AND end_expression
      

      When DropDownList6 = March and DropDownList8 = June 时为什么没有结果?

      有了上面的值,你的查询就变成了

      [Month] BETWEEN 'March' AND 'June'
      

      很遗憾,当您使用 BETWEEN, begin_expression should be less than or equal to end_expression 进行过滤时。在您的情况下,由于您已将月份(名称)作为字符串存储在数据库中,March comes after June in alphabetical order 等上述条件返回 false 并且没有结果。

      This is a fiddle example same as yours with no results.

      您可以使用各种方法从日期/日期时间字段中获取月份。在sql server中,可以使用;

      //Month NUMBER
      month(datefield) as month_Number 
      //Month NAME
      datename(month,datefield) as month_Name
      

      只是为了给您设计中最糟糕的一面。 Just check the results of where month between 'april' and 'may' 过滤。

      您的结果包括:August, December, February, January, July, June, March

      解决方案:

      由于您没有完整的日期,我想最好更新您的数据库,如下所示并将 [月] 的数据类型更改为 int 类型;

      update yourTable
      set [month] = case [month] when 'January' then 1
                                 when 'February' then 2
                                 ...
                                 when 'December' then 12 end
      

      现在将 [month] 的数据类型更改为 int 类型,然后将代码中的月份编号传递为

      [month] BETWEEN 3 and 6
      

      另外,字段名称尽量避免使用Month等关键字。

      【讨论】:

        【解决方案4】:

        我不确定您的数据库设计是什么,甚至不确定月份字段数据类型是什么,我首先同意其他人的观点,即这不是一个好的设计,因为我想不出我只能基于搜索的场景月。这应该是一个完整的日期字段。

        如果您向我们简要介绍此功能,例如您想在哪里使用它和用途,它可以让我们更好地了解。

        请不要把我当成批评者...关于您的项目的更多详细信息可以帮助我们更好地理解和推荐解决方案。可能是我错了,因为我可能没有理解你的问题。

        您可以使用给定的不错的解决方案,但请考虑未来的道路..

        【讨论】:

          猜你喜欢
          • 2021-09-03
          • 1970-01-01
          • 2021-04-13
          • 2010-12-25
          • 1970-01-01
          • 1970-01-01
          • 2013-05-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多