有张表
 
时间段          每小时价格(元)
星期一-五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求助给出开始时间和结束时间的总价该怎么用公式来计算?最好能给出完整的代码,万分感谢,人在,马上结帖!!

解决方案 »

  1.   

    DateTime startTime;//开始时间
    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点分开计费。
      

  2.   


    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
      

  3.   


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

  4.   


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