以递归方式存储两个日期之间的差异并计算在网站上花费的时间

时间:2014-06-27 05:41:11

标签: c# sql date datetime

我必须在网站上花费时间,所以我选择在数据库中维护2个日期时间和时间,以便我可以保存登录时间和注销时间之间的差异,并将其作为列timespent存储在表中。

时间将存储为{00:16:58.413785200}所以我在每次注销后递归添加一些时间,这样如果他在第一次登录时花费10分钟,在第2次登录时花费5分钟,我们必须存储15分钟在网站上的timspent。

但问题是如果我想在23:59:59.000000000之后加2分钟,我无法猜测会发生什么。我知道最大时间值是23:59:59,可以在sql中存储为time数据类型。

那么如何实现呢?我试过这样的

 var _user = db.Users.SingleOrDefault(t => t.Id == id);
 _user.EndTime = DateTime.Now;
 var _startTime = _user.StartTime;
 if (_user.TimeSpent != null)
 {
   _user.TimeSpent = _user.TimeSpent + (_user.EndTime - _startTime);
 }
 else
 {
   _user.TimeSpent = (_user.EndTime - _startTime);
 }
 db.SaveChanges();

3 个答案:

答案 0 :(得分:1)

您需要将TimeSpent列上的数据类型切换为bigintTimeSpent列的默认值为0,或者在代码中处理它。

var _user = db.Users.SingleOrDefault(t => t.Id == id);

_user.EndTime = DateTime.Now;
var _startTime = _user.StartTime;

TimeSpan timeSpent = _user.TimeSpent != null ? TimeSpan.FromTicks(_user.TimeSpent) : 0;
if (timeSpent > TimeSpan.Zero)
{
   timeSpent = timeSpent + (_user.EndTime - _startTime)
}
else
{
  timeSpent = _user.EndTime - _startTime
}

_user.TimeSpent = timeSpent.Ticks;

db.SaveChanges();

答案 1 :(得分:1)

你可以做一个简单的检查,看看结束时间<开始时间。如果是,则假设开始时间是前一天。这样的事情应该有效:

// _user.StartTime
TimeSpan startTime = TimeSpan.Parse("23:59:54");        

// DateTime.Now
DateTime now = new DateTime(2014, 04, 11, 00, 05, 00);

// Get the time portion of DateTime.Now
TimeSpan endTime = now - now.Date;


TimeSpan timeSpent = TimeSpan.Zero;

if (endTime > startTime)
    timeSpent = endTime - startTime;
else
    timeSpent = endTime - startTime + TimeSpan.FromHours(24);

Console.WriteLine(timeSpent);

答案 2 :(得分:0)

最好的方法是存储DateTime值而不仅仅是Time值。这样你就不会有这样的限制。即使您找到了24小时问题的解决方法,如果用户花费超过一天的时间(根据时差),您会怎么做?所以更好的前进方式 -

  1. 日期时间
  2. 长值 - 以刻度,秒数等为单位
  3. 但当然不仅仅是时间。您需要为此更改表格架构以及相当多的代码: - )