zoukankan      html  css  js  c++  java
  • 查询某个时间段在另一个时间段里面的时间

    具体业务:查询当前日期前后三个月的活动时间,日历上面的标签显示活动标记

    SQL:

    select ac.fieldBegin,ac.fieldEnd
    from t_VT_Activity as ac 
    where (ac.fieldBegin BETWEEN DATEADD(MONTH,-3,GETDATE()) AND DATEADD(MONTH,3,GETDATE())

    OR ac.fieldEnd BETWEEN DATEADD(MONTH,-3,GETDATE()) AND DATEADD(MONTH,3,GETDATE()))

    代码:

    public JsonR ActivityDateList()
    {

    var sql = string.Format(@"
    select ac.fieldBegin,ac.fieldEnd
    from t_VT_Activity as ac 
    where (ac.fieldBegin BETWEEN DATEADD(MONTH,-3,GETDATE()) AND DATEADD(MONTH,3,GETDATE())
    OR ac.fieldEnd BETWEEN DATEADD(MONTH,-3,GETDATE()) AND DATEADD(MONTH,3,GETDATE()))
    ")

    int totalCount = 0;

    //查询数据,按照活动开始时间排序,最小的在前面
    var dt = Wathet.DB.Config.Conn_Wathet.Scan_Page(sql, "fieldBegin", 1000, 1, totalCount);
    if (dt != null)
    {
    var list = new List<object>();

    //初始化最开始的日期(3个月前),循环 第一条日期,把活动结束日期赋值给开始日期,如果有了这个日期,就直接跳过日期循环
    DateTime prevTime = DateTime.Now.AddMonths(-3);
    foreach (System.Data.DataRow row in dt.Rows)
    {
    DateTime fieldBegin = row["fieldBegin"].ToDateTime();
    DateTime fieldEnd = row["fieldEnd"].ToDateTime();
    for (DateTime time = prevTime; time < DateTime.Now.AddMonths(3); time = time.AddDays(1))
    {
    if (time >= fieldBegin && time <= fieldEnd)
    {
    if (!list.Contains(time))
    {
    list.Add(time.ToDateTime()); totalCount++;
    }
    }
    }

    //记录插入的最后一个日期
    prevTime = list.Last().ToDateTime();
    }
    return ComEnum.Code.A_操作成功.JsonR(new JsonR_EntityList()
    {
    totalCount = totalCount,
    list = list
    });
    }
    return ComEnum.Code.A_操作失败.JsonR();
    }

    以下为优化版

    public JsonR ActivityCalendar(int year,int month)
    {
    var portalId = Tools.GetPortal();

    var beginDate = (year.ToString() + "-" + month.ToString() + "-" + "01").ToDateTime();
    var endDate = (year.ToString() + "-" + (month + 1).ToString() + "-" + "01").ToDateTime();

    var sql = string.Format(@"
    select ac.fieldBegin,ac.fieldEnd
    from t_VT_Activity as ac with(nolock)
    right join (select id,sourceid,codeno,sortno from t_ui_ele where portalid={0} and valid=1 and deleted=0 and partid={1}) as ele on ele.codeno=ac.codeno
    where (ac.fieldBegin<'{3}' and ac.fieldEnd>='{4}') and
    ac.valid=1 and ac.deleted=0 and ac.typeId={2} ",
    portalId,
    ComEnum.UI_Ele_WX.活动列表.GetHashCode(),
    ComEnum.SaleActivityType.报名.GetHashCode(),endDate,beginDate);

    int totalCount = 0;
    var dt = Wathet.DB.Config.Conn_Wathet.Scan_Page(sql, "fieldBegin", 1000, 1, ref totalCount);
    totalCount = 0;
    if (dt != null)
    {
    var list = new List<object>();

    foreach (System.Data.DataRow row in dt.Rows)
    {

    var fieldBegin = row["fieldBegin"].ToDateTime();
    var fieldEnd = row["fieldEnd"].ToDateTime().AddDays(1);

    var scopeBegin = fieldBegin > beginDate ? fieldBegin : beginDate;
    var scopeEnd = fieldEnd < endDate ? fieldEnd : endDate;

    for (DateTime time = scopeBegin; time < scopeEnd; time = time.AddDays(1))
    {
    var timeFormat = time.Format_yyyyMMdd();
    if (!list.Contains(timeFormat))
    {
    list.Add(timeFormat); totalCount++;
    }
    }
    }
    return ComEnum.Code.A_操作成功.JsonR(new JsonR_EntityList()
    {
    totalCount = totalCount,
    list = list.OrderBy(o=>o).ToList()
    });
    }
    return ComEnum.Code.A_操作失败.JsonR();
    }

  • 相关阅读:
    SpringMVC请求静态资源
    Spring视图和视图解析器
    @ModelAttribute运行流程
    SpringMVC模型数据处理
    SpringMVC简单映射请求参数介绍
    队列和栈的问题
    非比较排序——计数排序、基数排序、桶排序
    递归
    对数器的使用
    常见的比较排序
  • 原文地址:https://www.cnblogs.com/TREN/p/11325836.html
Copyright © 2011-2022 走看看