查询某个时间段在另一个时间段里面的时间

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

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();
}

原文地址:https://www.cnblogs.com/TREN/p/11325836.html