我有两个下拉列表,一个是月份,另一个是年份。用户为他们想要检索的项目选择提交月份和年份。在数据库中,日期是以完整的形式输入的。01/12/2009.在下拉列表中有一个“所有年份”和“所有月份”的选项,但当用户选择其中任何一个时,他们都会得到null结果。非常感谢。这是我的问题:
SELECT ItemID, YEAR(Submit) AS SubmitYear, MONTH(Submit) AS SubmitMonth
FROM Items
WHERE (YEAR(Submit) LIKE ISNULL(@YearPay, ''))
AND (MONTH(Submit) LIKE ISNULL(@MonthPay, ''))我的参数是:
<asp:ControlParameter ControlID="DropDownList1" DefaultValue="" Name="YearPay" PropertyName="SelectedValue" />
<asp:ControlParameter ControlID="DropDownList2" DefaultValue="" Name="MonthPay" PropertyName="SelectedValue" />
发布于 2009-12-11 01:24:16
这里有一个解决问题的方法:
SELECT ItemID, YEAR(Submit) AS SubmitYear, MONTH(Submit) AS SubmitMonth
FROM Items
WHERE (YEAR(Submit) = @YearPay OR @YearPay IS NULL)
AND (MONTH(Submit) = @MonthPay OR @MonthPay IS NULL)这样,如果您为任一变量传入NULL,WHERE子句的该部分将返回true。
发布于 2009-12-11 01:27:39
一种相当快速的方法是确保@YearPay和@MonthPay是整数数据类型,然后传入(例如) -1来表示"ALL",因此您的查询将变为:
SELECT ItemID, YEAR(Submit) AS SubmitYear, MONTH(Submit) AS SubmitMonth
FROM Items
WHERE (YEAR(Submit) = @YearPay OR @YearPay = -1)
AND (MONTH(Submit) = @MonthPay OR @MonthPay = -1)但是,对于整体性能,我个人不会使用这种方式,使用YEAR()和MONTH(),因为您不会获得良好的索引使用率。相反,我倾向于将查询更改为只接受一个日期范围,这样,.NET代码就会根据所选下拉项生成to和from日期。
例如:
SELECT ItemID, YEAR(Submit) AS SubmitYear, MONTH(Submit) AS SubmitMonth
FROM Items
WHERE (Submit >= @FromDate OR @FromDate IS NULL)
AND (Submit < @ToDate OR @ToDate IS NULL)因此,使用以下示例进行月/年选择:
2009年1月将导致@FromDate = ' 2009 -01-01',@ToDate - '2009-02-01‘
任何月份,2009都会导致@FromDate = '2009-01-01',@ToDate = '2010-01-01‘
任何月份、任何年份都会导致= @FromDate = NULL,@ToDate = NULL
发布于 2009-12-11 01:30:27
尝尝这个
select * from sys.tables where name like ''还有这个
select * from sys.tables where name like '%%'话虽如此,我完全同意内巴卡内泽的评论(和解决方案)。
https://stackoverflow.com/questions/1882548
复制相似问题