有张表
时间段 每小时价格(元)
星期一-五6:00-20:00 30
星期一-五20:00-24:00 60
星期一-五00:00-6:00 10
星期六、日6:00-20:00 50
星期六、日20:00-24:00 100求助给出开始时间和结束时间的总价该怎么用公式来计算?最好能给出完整的代码,万分感谢,人在,马上结帖!!
时间段 每小时价格(元)
星期一-五6:00-20:00 30
星期一-五20:00-24:00 60
星期一-五00:00-6:00 10
星期六、日6:00-20:00 50
星期六、日20:00-24:00 100求助给出开始时间和结束时间的总价该怎么用公式来计算?最好能给出完整的代码,万分感谢,人在,马上结帖!!
DateTime endTime;//结束时间
DayOfWeek weekDay=startTime.DayOfWeek;//取得是星期几
Timespan lastTime=endTime-startTime;
double fee=0.0;
switch(weekDay)
{
case Friday:fee=lastTime.TotalHours*每小时价格;
.....//周二、周三、周四计算,类推
}上面的例子是时间在当天的,如果涉及跨天的,比如今天晚上9点到明早3点,则分为今晚9点到今天12点、第二天0点到第二天3点分开计费。
declare @startTime dateTime
declare @endTime dateTime
set @startTime=REPLACE(CONVERT(varchar(10),DateAdd(day,-7,DATEADD(Day,2-DATEPART(Weekday,getdate()),getdate())),120),N'-0','-')
set @endTime=REPLACE(CONVERT(varchar(10),DateAdd(day,-1,DATEADD(Day,2-DATEPART(Weekday,getdate()),getdate())),120),N'-0','-')declare @temp table([Weekday] varchar(50),price int)
while(@startTime<=@endTime)
begin
insert @temp
select DATENAME(Weekday,@startTime),'10' --此处可根据你的需求对表进行查询,比如查询某个时间段的总价
set @startTime=DateAdd(day,1,@startTime)
end
select * from @temp
public static double GetTotalMoney(DateTime beginTime, DateTime endTime)
{
if (beginTime > endTime)
return -1;
double result = 0;
for (DateTime dt = beginTime; dt <= endTime; dt = dt.AddSeconds(1))
{
if (dt.DayOfWeek >= DayOfWeek.Monday && dt.DayOfWeek <= DayOfWeek.Friday)
{
if (dt >= new DateTime(dt.Year, dt.Month, dt.Day, 6, 0, 0) && dt < new DateTime(dt.Year, dt.Month, dt.Day, 20, 0, 0))
result += 1d / 120d;
else if (dt >= new DateTime(dt.Year, dt.Month, dt.Day, 20, 0, 0) && dt < new DateTime(dt.Year, dt.Month, dt.Day + 1, 0, 0, 0))
result += 1d / 60d;
else if (dt >= new DateTime(dt.Year, dt.Month, dt.Day, 0, 0, 0) && dt < new DateTime(dt.Year, dt.Month, dt.Day, 6, 0, 0))
result += 1d / 360d;
}
else
{
if (dt >= new DateTime(dt.Year, dt.Month, dt.Day, 6, 0, 0) && dt < new DateTime(dt.Year, dt.Month, dt.Day, 20, 0, 0))
result += 1d / 72d;
else if (dt >= new DateTime(dt.Year, dt.Month, dt.Day, 20, 0, 0) && dt < new DateTime(dt.Year, dt.Month, dt.Day + 1, 0, 0, 0))
result += 5d / 18d;
else if (dt >= new DateTime(dt.Year, dt.Month, dt.Day, 0, 0, 0) && dt < new DateTime(dt.Year, dt.Month, dt.Day, 6, 0, 0))
result += 1d / 180d;
}
}
return result;
}
private double fee(DateTime s, DateTime e)
{
if (s.CompareTo(e) >= 0) return 0;
if (e.Subtract(s).TotalHours < 1 && s.Hour == e.Hour) return e.Subtract(s).TotalHours * FeePerHour(s);
DateTime temp = new DateTime(s.AddHours(1).Year, s.AddHours(1).Month, s.AddHours(1).Day, s.AddHours(1).Hour, 0, 0);
double f = temp.Subtract(s).TotalHours * FeePerHour(s);
while (true)
{
if (temp.AddHours(1).CompareTo(e) <= 0)
{
f += FeePerHour(temp);
temp = temp.AddHours(1);
}
else
{
break;
}
}
f += e.Subtract(temp).TotalHours * FeePerHour(temp);
return f;
}
private int FeePerHour(DateTime s)
{
//星期一-五6:00-20:00 30
//星期一-五20:00-24:00 60
//星期一-五00:00-6:00 10
//星期六、日6:00-20:00 50
//星期六、日20:00-24:00 100
//星期六、日00:00-6:00 20
int d = (int)s.DayOfWeek;
int h = s.Hour;
if (d >= 1 && d <= 5)
{
if (h >= 0 && h < 6) return 10;
if (h >= 6 && h < 20) return 30;
return 60;
}
else
{
if (h >= 0 && h < 6) return 20;
if (h >= 6 && h < 20) return 50;
return 100;
}
}