Преобразование времени и даты, представленной как INT, в структуру DateTime в LINQ

В настоящее время я запрашиваю msdb.dbo.sysjobhistory Таблица, чтобы найти статус заданий, выполненных сегодня и показать их в браузере. Определение этой таблицы выглядит следующим образом. Таблица sysjobshistory Определение

Вот 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

Другие вопросы по тегам