【问题标题】:ISNULL Date monthISNULL 日期月份
【发布时间】:2009-12-10 17:18:17
【问题描述】:

我有两个下拉列表,一个带有月份,另一个带有年份。用户选择他们想要检索的项目的提交月份和年份。在数据库中输入完整的日期,例如。 2009 年 1 月 12 日。下拉列表中有“所有年份”和“所有月份”选项,但是当用户选择其中任何一个时,他们会得到空结果。非常感谢。这是我的查询:

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" />

【问题讨论】:

  • 为什么在where子句中需要like?这绝不是部分匹配,对吧?
  • 你说得对,谢谢你的帮助。

标签: asp.net datetime isnull


【解决方案1】:

这是解决问题的一种方法:

 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。

【讨论】:

  • 请注意性能,通过在提交字段上调用函数来获取年份和月份,您会发现索引不会有太大用处。如果您有大量数据,可能会受到严重伤害
【解决方案2】:

一种相当快捷的方法是确保@YearPay 和@MonthPay 是INTEGER 数据类型,然后传入(例如)-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 代码根据所选的下拉项生成到日期和起止日期。

例如

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

【讨论】:

    【解决方案3】:

    试试这个

    select * from sys.tables where name like ''
    

    还有这个

    select * from sys.tables where name like '%%'
    

    话虽如此,我完全同意 Nebakanezer 的评论(和解决方案)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 1970-01-01
      • 2018-10-15
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      相关资源
      最近更新 更多