求算法:一段时间段内的星期几到星期几的集合

ohyear 2009-03-31 06:05:55
假设时间段为2009-04-01到2009-04-30.
我想得到这段时间内,每逢周一至周二的日期,要返回的结果集可以为DataTable(两列-周二日期和周三日期),或是二维数组(周二日期,周三日期)

另外:因为4月1号是星期三,所以周一至周二只有如下数据:
周一 周二
2009-04-06 2009-04-07
2009-04-13 2009-04-14
2009-04-20 2009-04-21
2009-04-27 2009-04-28

即,超过起始日期的星期几不算在内.

使用C#或是Sql给的算法都行....
在线急等..先谢了!
...全文
167 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
我姓区不姓区 2009-03-31
  • 打赏
  • 举报
回复
修改一下:

static DataTable GetDates(DateTime dtStart, DateTime dtEnd)
{
DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[] { new DataColumn("Monday", typeof(string)), new DataColumn("Tuesday", typeof(string)) });
DateTime time = dtStart;
while (time.DayOfWeek != DayOfWeek.Monday)
time = time.AddDays(1);
dt.Rows.Add(time.ToString("yyyy-MM-dd"), time.AddDays(1).ToString("yyyy-MM-dd"));
for (time = time.AddDays(7); time <= dtEnd; time = time.AddDays(7))
dt.Rows.Add(time.ToString("yyyy-MM-dd"), time.AddDays(1) > dtEnd ? "" : time.AddDays(1).ToString("yyyy-MM-dd"));
return dt;
}
我姓区不姓区 2009-03-31
  • 打赏
  • 举报
回复

static void Main(string[] args)
{
DataTable dt = GetDates(new DateTime(2009, 4, 1), new DateTime(2009, 4, 30));
foreach (DataRow dr in dt.Rows)
Console.WriteLine("Monday:{0},Tuesday:{1}", dr[0], dr[1]);
}

static DataTable GetDates(DateTime dtStart, DateTime dtEnd)
{
DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[] { new DataColumn("Monday", typeof(string)), new DataColumn("Tuesday", typeof(string)) });
DateTime time = dtStart;
while (time.DayOfWeek != DayOfWeek.Monday)
time = time.AddDays(1);
dt.Rows.Add(time.ToString("yyyy-MM-dd"), time.AddDays(1).ToString("yyyy-MM-dd"));
for (; time <= dtEnd; time = time.AddDays(7))
dt.Rows.Add(time.ToString("yyyy-MM-dd"), time.AddDays(1) > dtEnd ? "" : time.AddDays(1).ToString("yyyy-MM-dd"));
return dt;
}
/*
输出:
Monday:2009-04-06,Tuesday:2009-04-07
Monday:2009-04-06,Tuesday:2009-04-07
Monday:2009-04-13,Tuesday:2009-04-14
Monday:2009-04-20,Tuesday:2009-04-21
Monday:2009-04-27,Tuesday:2009-04-28
*/
wuyq11 2009-03-31
  • 打赏
  • 举报
回复
select datepart(weekday,getdate()) 为1 或2
select ( datepart(weekday,getdate()) + @@datefirst-1 ) % 7
dyshadow 2009-03-31
  • 打赏
  • 举报
回复
ReturnWeekDay(DateTime startDate, DateTime endDate, DayOfWeek startWeekDay, int daySpan)

startDate 开始日期,从哪个日期开始计算
endDate 结束日期,到该日期计算终止
startWeekDay 开始记录的日期是周几
daySpan 一共要记录几天

liu4545533 2009-03-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xiaoqhuang 的回复:]
declare @startDate datetime set @startDate='2009-04-01'
declare @endDate datetime set @endDate='2009-04-30'
declare @t table(Monday datetime,Tuesday datetime)
while dateadd(day,1,@startDate) <=@endDate
begin
if datepart(w,@startDate)=2
insert into @t select @startDate,dateadd(day,1,@startDate)
set @startDate=dateadd(day,1,@startDate)
end

--select * from @t
[/Quote]
应该不要象仁兄这样做吧
Data类在c#里面可是超级强大的
其实可以用一个for循环 在循环内部判断是否为周一 和周二 并把其保存在不同的数组内部
这样很好实现
dyshadow 2009-03-31
  • 打赏
  • 举报
回复
通用程序代码:


private DataTable ReturnWeekDay(DateTime startDate, DateTime endDate, DayOfWeek startWeekDay, int daySpan)
{
DataTable tableToReturn = new DataTable("DayTable");
for (int i = 0; i < daySpan; i++)
tableToReturn.Columns.Add(new DataColumn());
int iIndex = daySpan +1;
DataRow newRow = null;
for (DateTime currentDate = startDate; currentDate <= endDate; currentDate = currentDate.AddDays(1))
{
iIndex++;
if (currentDate.DayOfWeek == startWeekDay)
{
newRow= tableToReturn.Rows.Add (currentDate.ToString ("yyyy-MM-dd"));
iIndex = 0;
}
if (iIndex < daySpan && iIndex > 0)
newRow[iIndex] = currentDate.ToString("yyyy-MM-dd");
}
return tableToReturn;
}


调用例


DataTable dt = ReturnWeekDay(new DateTime(2009, 1, 1), new DateTime(2009, 2, 1), DayOfWeek.Monday, 2);

ljhcy99 2009-03-31
  • 打赏
  • 举报
回复
DateTime d1 = new DateTime(2009, 4, 1);
DateTime d2 = new DateTime(2009, 4, 30);
DateTime d3 = d1;
DateTime d4 = d3;
//
DataTable table = new DataTable();
DataColumn col1 = new DataColumn("monday",Type.GetType("System.String"));
DataColumn col2 = new DataColumn("Tuseday", Type.GetType("System.String"));
table.Columns.Add(col1);
table.Columns.Add(col2);
//
while (DateTime.Compare(d3, d2) <= 0)
{
DayOfWeek week = d3.DayOfWeek;
if (week.ToString() == "Monday")
{
DataRow r = table.NewRow();
r[0] = d4.ToString();
r[1] = (d4.AddDays(1)).ToString();
table.Rows.Add(r);
}
d3 = d3.AddDays(1);
d4 = d3;
}
xiaoqhuang 2009-03-31
  • 打赏
  • 举报
回复
declare @startDate datetime set @startDate='2009-04-01'
declare @endDate datetime set @endDate='2009-04-30'
declare @t table(Monday datetime,Tuesday datetime)
while dateadd(day,1,@startDate)<=@endDate
begin
if datepart(w,@startDate)=2
insert into @t select @startDate,dateadd(day,1,@startDate)
set @startDate=dateadd(day,1,@startDate)
end

--select * from @t

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧