Преобразование времени и даты, представленной как INT, в структуру DateTime в LINQ
В настоящее время я запрашиваю msdb.dbo.sysjobhistory
Таблица, чтобы найти статус заданий, выполненных сегодня и показать их в браузере. Определение этой таблицы выглядит следующим образом.
Вот run_date
а также run_time
соответствуют дате и времени выполнения конкретной работы, представленной в виде int
конечно. Я пытаюсь построить DateTime
введите из этих атрибутов, чтобы было проще просматривать его в одном столбце, а не в двух отдельных столбцах.
пример
run_date = 20161125
run_time = 33000
runStartTime = 2016-11-25 03:30:00
Класс ViewModel, который я определил,
public class ExecutedJobsViewModel
{
public string jobName { get; set; }
public int stepID { get; set; }
public string stepName { get; set; }
public string message { get; set; }
public DateTime runStartTime { get; set; }
public int runStatus { get; set; }
public int runDuration { get; set; }
}
и код, который выбирает эти данные
private async Task<List<ExecutedJobsViewModel>> getExecutedJobs()
{
using(var context = new SysTableEntity())
{
return await (from job in context.sysjobs
join history in context.sysjobhistories
on job.job_id equals history.job_id
select new ExecutedJobsViewModel
{
jobName = job.name,
message = history.message,
stepID = history.step_id,
stepName = history.step_name,
runStatus = history.run_status,
runDuration = history.run_duration,
runStartTime = // Bind data here
}).ToListAsync();
}
}
Единственное решение, которое я мог придумать, было DbFunctions.CreateDateTime(int? years, int? months, int? days, int? hours, int? minutes, int? seconds)
что слишком много работы, учитывая, что int
должен быть преобразован в string
а затем найти подстроку и затем преобразовать обратно в int
, Кроме того, обрабатывать край случае, как 33000
которые состоят из пяти цифр, а не времени, которое представлено шестизначным числом (183000
).
Можете ли вы предложить более простой способ добиться этого.
1 ответ
Ваш первый вариант будет использовать dbo.agent_datetime
в вашем запросе, чтобы получить значение datetime из SQL (см. этот пример)
Если вы не можете сделать это, то вы можете использовать DateTime.ParseExact
чтобы указать формат даты и времени:
var date = DateTime.ParseExact("20161125", "yyyyMMdd",
System.Globalization.CultureInfo.InvariantCulture);
var time = DateTime.ParseExact("183000", "HHmmss",
System.Globalization.CultureInfo.InvariantCulture)
Это не касается случая, когда время составляет только 5 цифр. Я не уверен, как это интерпретировать, но если крайний случай всегда представляет пропущенный час, вы можете добавить это, используя PadLeft
, например
var time = "33000";
if(time.Length == 5) time = time.PadLeft(6, '0');
Если пропущенная цифра всегда секунда, то вы хотите использовать PadLeft