文章类型: .NET
关键词: C#,SQL,存储过程,日期时间,时间日期,DateTime,复杂查询
内容摘要: 使用C#和SQL存储过程来按日期时间进行分页的复杂查询

使用C#编程和SQL的存储过程来处理日期时间的复合查询问题

2015/7/14 16:20:50    来源:apple    阅读:

SQL存储过程的关键代码如下:

CREATE PROCEDURE [dbo].[usp_GetArticleByCategoryIDAndModifiedTime] 
    -- Add the parameters for the stored procedure here 
    @categoryID int=-1, 
    @searchModifiedTime nvarchar(50), 
    @searchTimeRange nvarchar(20) 
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 
  
    -- Insert statements for procedure here 
    if (@categoryID = -1) 
    begin
        if (@searchTimeRange='dy') 
            SELECT ArticleID,Title,ArticleLabel,CONVERT(NVARCHAR(16),CreatedTime,120) AS CreatedTime,Clicks from Article where ModifiedTime between @searchModifiedTime and DATEADD(DAY,1,@searchModifiedTime) order by CreatedTime desc
        else if (@searchTimeRange='mm') 
            SELECT ArticleID,Title,ArticleLabel,CONVERT(NVARCHAR(16),CreatedTime,120) AS CreatedTime,Clicks from Article where ModifiedTime between @searchModifiedTime and DATEADD(MM,1,@searchModifiedTime) order by CreatedTime desc
        else if (@searchTimeRange='yy') 
            SELECT ArticleID,Title,ArticleLabel,CONVERT(NVARCHAR(16),CreatedTime,120) AS CreatedTime,Clicks from Article where ModifiedTime between @searchModifiedTime and DATEADD(YY,1,@searchModifiedTime) order by CreatedTime desc
        else if (@searchTimeRange='3day') 
            SELECT ArticleID,Title,ArticleLabel,CONVERT(NVARCHAR(16),CreatedTime,120) AS CreatedTime,Clicks from Article where ModifiedTime between @searchModifiedTime and DATEADD(DAY,3,@searchModifiedTime) order by CreatedTime desc
        else if (@searchTimeRange='wk') 
            SELECT ArticleID,Title,ArticleLabel,CONVERT(NVARCHAR(16),CreatedTime,120) AS CreatedTime,Clicks from Article where ModifiedTime between @searchModifiedTime and DATEADD(WK,1,@searchModifiedTime) order by CreatedTime desc
        else if (@searchTimeRange='3mm') 
            SELECT ArticleID,Title,ArticleLabel,CONVERT(NVARCHAR(16),CreatedTime,120) AS CreatedTime,Clicks from Article where ModifiedTime between @searchModifiedTime and DATEADD(MM,3,@searchModifiedTime) order by CreatedTime desc
        else if (@searchTimeRange='before') 
            SELECT ArticleID,Title,ArticleLabel,CONVERT(NVARCHAR(16),CreatedTime,120) AS CreatedTime,Clicks from Article where ModifiedTime < @searchModifiedTime order by CreatedTime desc
        else
            SELECT ArticleID,Title,ArticleLabel,CONVERT(NVARCHAR(16),CreatedTime,120) AS CreatedTime,Clicks from Article where ModifiedTime > @searchModifiedTime order by CreatedTime desc
    end 
    else
    begin
        if (@searchTimeRange='dy') 
            SELECT ArticleID,Title,ArticleLabel,CONVERT(NVARCHAR(16),CreatedTime,120) AS CreatedTime,Clicks from Article where CategoryID=@categoryID and ModifiedTime between @searchModifiedTime and DATEADD(DAY,1,@searchModifiedTime) order by CreatedTime desc
        else if (@searchTimeRange='mm') 
            SELECT ArticleID,Title,ArticleLabel,CONVERT(NVARCHAR(16),CreatedTime,120) AS CreatedTime,Clicks from Article where CategoryID=@categoryID and ModifiedTime between @searchModifiedTime and DATEADD(MM,1,@searchModifiedTime) order by CreatedTime desc
        else if (@searchTimeRange='yy') 
            SELECT ArticleID,Title,ArticleLabel,CONVERT(NVARCHAR(16),CreatedTime,120) AS CreatedTime,Clicks from Article where CategoryID=@categoryID and ModifiedTime between @searchModifiedTime and DATEADD(YY,1,@searchModifiedTime) order by CreatedTime desc
        else if (@searchTimeRange='3day') 
            SELECT ArticleID,Title,ArticleLabel,CONVERT(NVARCHAR(16),CreatedTime,120) AS CreatedTime,Clicks from Article where CategoryID=@categoryID and ModifiedTime between @searchModifiedTime and DATEADD(DAY,3,@searchModifiedTime) order by CreatedTime desc
        else if (@searchTimeRange='wk') 
            SELECT ArticleID,Title,ArticleLabel,CONVERT(NVARCHAR(16),CreatedTime,120) AS CreatedTime,Clicks from Article where CategoryID=@categoryID and ModifiedTime between @searchModifiedTime and DATEADD(WK,1,@searchModifiedTime) order by CreatedTime desc
        else if (@searchTimeRange='3mm') 
            SELECT ArticleID,Title,ArticleLabel,CONVERT(NVARCHAR(16),CreatedTime,120) AS CreatedTime,Clicks from Article where CategoryID=@categoryID and ModifiedTime between @searchModifiedTime and DATEADD(MM,3,@searchModifiedTime) order by CreatedTime desc
        else if (@searchTimeRange='before') 
            SELECT ArticleID,Title,ArticleLabel,CONVERT(NVARCHAR(16),CreatedTime,120) AS CreatedTime,Clicks from Article where CategoryID=@categoryID and ModifiedTime < @searchModifiedTime order by CreatedTime desc
        else
            SELECT ArticleID,Title,ArticleLabel,CONVERT(NVARCHAR(16),CreatedTime,120) AS CreatedTime,Clicks from Article where CategoryID=@categoryID and ModifiedTime > @searchModifiedTime order by CreatedTime desc
    end
END

如果使用分页的存储过程则可以简化代码的编写处理,分页的存储过程见前篇代码所示:

下面给出了C#的逻辑处理代码如下:

/// <summary> 
/// 得到查询的文章的数量 
/// </summary> 
/// <param name="articleTimeType">文章时间类型,分为“发布时间”与“更新时间”</param> 
/// <param name="startTime">搜索的开始时间</param> 
/// <param name="timeRange">搜索的时间范围</param> 
/// <param name="categoryID">文章类别编号</param> 
/// <returns>返回查询到的文章的数量</returns> 
public static long GetArticleRecordCountByArticleTimeTypeAndCategoryID(string articleTimeType, string startTime, string timeRange, int categoryID) 
{ 
    string strWhere = string.Empty; 
    if (articleTimeType.Equals("createTime")) 
    { 
        strWhere = GetSearchWhereByCreateTimeAndCategoryID("CreatedTime", startTime, timeRange, categoryID); 
    } 
    else
    { 
        strWhere = GetSearchWhereByCreateTimeAndCategoryID("ModifiedTime", startTime, timeRange, categoryID); 
    } 
    return ArticleService.GetArticleRecordCount(strWhere); 
} 
  
/// <summary> 
/// 根据文章类型和文章是否包含图片进行查询的文章信息 
/// </summary> 
/// <param name="articleTimeType">文章时间类型,分为“发布时间”与“更新时间”</param> 
/// <param name="startTime">搜索的开始时间</param> 
/// <param name="timeRange">搜索的时间范围</param> 
/// <param name="categoryID">文章类别编号</param> 
/// <param name="pageSize">分页大小</param> 
/// <param name="pageIndex">当前页的索引</param> 
/// <returns>返回查询到的文章信息</returns> 
public static IList<Article> GetArticleByArticleTimeTypeAndCategoryID(string articleTimeType, string startTime, string timeRange, int categoryID, int pageSize, long pageIndex) 
{ 
    string strWhere = string.Empty; 
    if (articleTimeType.Equals("createTime")) 
    { 
        strWhere = GetSearchWhereByCreateTimeAndCategoryID("CreatedTime", startTime, timeRange, categoryID); 
    } 
    else
    { 
        strWhere = GetSearchWhereByCreateTimeAndCategoryID("ModifiedTime", startTime, timeRange, categoryID); 
    } 
    return ArticleService.GetArticlePagerData("ArticleID,Title,ArticleLabel,CONVERT(NVARCHAR(16),CreatedTime,120) AS CreatedTime,Clicks", "CreatedTime", "desc", strWhere, pageSize, pageIndex); 
} 
  
private static string GetSearchWhereByCreateTimeAndCategoryID(string columnName,string startTime, string timeRange, int categoryID) 
{ 
    string strWhere = string.Empty; 
    string startTimeType = string.Empty; 
  
    if (startTime.Length == 4) 
    { 
        startTime += "-1-1"; 
        startTimeType = "yy"; 
    } 
    else if (startTime.Length < 8) 
    { 
        startTime += "-1"; 
        startTimeType = "mm"; 
    } 
    else
    { 
        startTimeType = "dy"; 
    } 
  
    switch (timeRange) 
    { 
        case "3d": 
            strWhere = columnName + " between '" + startTime + "' and '" + Convert.ToDateTime(startTime).AddDays(3) + "'"; 
            break; 
        case "wk": 
            strWhere = columnName + " between '" + startTime + "' and '" + Convert.ToDateTime(startTime).AddDays(7) + "'"; 
            break; 
        case "3m": 
            strWhere = columnName + " between '" + startTime + "' and '" + Convert.ToDateTime(startTime).AddMonths(3) + "'"; 
            break; 
        case "before": 
            strWhere = columnName + " < '" + startTime + "'"; 
            break; 
        case "after": 
            strWhere = columnName + " > '" + startTime + "'"; 
            break; 
        default: 
            switch (startTimeType) 
            { 
                case "yy": 
                    strWhere = columnName + " between '" + startTime + "' and '" + Convert.ToDateTime(startTime).AddYears(1) + "'"; 
                    break; 
                case "mm": 
                    strWhere = columnName + " between '" + startTime + "' and '" + Convert.ToDateTime(startTime).AddMonths(1) + "'"; 
                    break; 
                default: 
                    strWhere = columnName + " between '" + startTime + "' and '" + Convert.ToDateTime(startTime).AddDays(1) + "'"; 
                    break; 
            } 
            break; 
    } 
  
    if (categoryID != -1) 
    { 
        strWhere += "and categoryID=" + categoryID; 
    } 
  
    return strWhere; 
}

 

↑ 上一篇文章:使用SQL的存储过程来处理字符串分割的模糊查询问题 关键词:存储过程,procedure,字符串分割,模糊查询,SQ.. 发布日期:2015/7/14 16:19:15
↓ 下一篇文章:过程需要类型SQL存储过程需要类型为ntext/nchar/nvarchar的参数@statement 关键词:SQL,存储过程,ntext/nchar/nvarcha.. 发布日期:2015/7/14 16:22:36
相关文章:
日期DateTime类型在.net中模糊查询SQL数据库的思路分析 关键词:日期类型,DateTime,C#,.net,模糊查询,like查询,SQL,Server,数据库.. 发布日期:2015-07-14 15:51
ASP.NET C#调用存储过程来获取output参数的值 关键词:asp.net,C#,SQL,Server,存储过程,output参数值 发布日期:2015-07-07 17:44
vc++中,ado执行sql server存储过程 关键词:vc++中,ado执行sql,server存储过程 发布日期:2016-09-21 16:04
相关目录:.NETDATABASE
我要评论
正在加载评论信息......