#c# #sql #date #datetime
#c# #sql #Дата #дата и время
Вопрос:
Мне нужно найти время, проведенное на сайте, поэтому я выбираю поддерживать 2 даты и время в базе данных, чтобы я мог сохранить разницу между временем входа в систему и временем выхода из системы и сохранить ее в таблице в виде столбца timespent
.
Время будет сохранено, {00:16:58.413785200}
поэтому я рекурсивно добавляю некоторое количество времени после каждого выхода из системы, так что, если он потратил 10 минут при первом входе в систему и 5 минут при втором входе, мы должны сохранить 15 минут для времени, потраченного на сайте.
Но проблема в том, что я не могу угадать, что произойдет, если я захочу добавить 2 минуты после 23:59:59.000000000. Я знаю, что максимальное значение времени равно 23:59:59, которое может быть сохранено для типа данных time в sql.
Итак, как этого добиться? Я пробовал так
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();
Комментарии:
1. Обычно я сохранял галочки (long для .net и bigint для sqlserver), а затем использовал это значение. Тогда временной интервал не будет ограничен только 23:59:59.
2. не могли бы вы предложить какой-нибудь код в соответствии с моим требованием
Ответ №1:
Вам нужно будет переключить тип данных в TimeSpent
столбце на bigint
. У вас также должно быть значение по умолчанию 0 для TimeSpent
столбца или обрабатывать его в вашем коде.
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();
Ответ №2:
Вы можете выполнить простую проверку, чтобы увидеть, является ли время окончания <временем начала. Если это так, то предположим, что время начала было в предыдущий день. Что-то вроде этого должно работать:
// _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);
Ответ №3:
Лучшим способом было бы сохранить значение даты и времени вместо просто значения времени. Таким образом, у вас не будет таких ограничений. Даже если вы нашли обходной путь для 24-часовой проблемы, что бы вы сделали, если возникнет ситуация, когда пользователь потратил более одного дня (в зависимости от разницы во времени)? Итак, лучшие пути вперед —
- Дата и время
- Длинное значение — в тактах, количестве секунд и т. Д
Но, конечно, не только время. Для этого вам нужно будет изменить схему таблицы и немного кода 🙂
Комментарии:
1. Даты и время должны храниться в UTC, если они используются в контексте, где применяются несколько часовых поясов. Затем вы должны применить правильный часовой пояс для каждого пользователя при представлении.