0

我的数据库中有一个名为“月”的列。我想做的是在两个月之间过滤表格。这方面的例子是 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

是否有解决方法,以便我可以按照月份的顺序排列月份,而不是按字母顺序排列

4

4 回答 4

1

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

于 2013-05-23T11:09:00.813 回答
0

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

如果您向我们简要介绍此功能,例如您想在哪里使用它和目的,它可以给我们更好的主意。

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

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

于 2013-05-23T13:04:33.173 回答
0

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

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))
于 2013-05-23T11:28:59.437 回答
0

这是 BETWEEN 的 MSDN 语法

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 并且没有结果。

这是一个与您相同的小提琴示例,没有结果。

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

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

只是为了给您设计中最糟糕的一面。只需检查过滤的结果where month between 'april' and 'may'

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

解决方案:

由于您没有完整的日期,我想最好更新您的数据库,如下所示并将 [month] 的数据类型更改为 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使用字段名称等关键字。

于 2013-05-23T11:35:54.857 回答