2016-11-25 21 views
1

我當前正在查詢msdb.dbo.sysjobhistory表以查找當前執行的作業的狀態並在瀏覽器中顯示它們。該表的定義如下所示。 sysjobshistory Table Definition將表示爲INT的時間和日期轉換爲LINQ中的DateTime結構

run_date這裏並​​對應的日期和時被執行特定作業都表示爲當然int時間。我試圖從這些屬性中構造一個DateTime類型,以便在單個列中而不是兩個單獨的列中查看它。

run_date = 20161125 
run_time = 33000 
runStartTime = 2016-11-25 03:30:00 

我已經定義視圖模型類是

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)這是太多的工作k假設int必須轉換爲string,然後找到子字符串,然後再轉換回int。此外,處理像33000這樣的邊緣情況,它是五位數字,而不是以六位數字表示的時間(183000)。

你能提出一個更簡單的方法來實現這一點。

+0

將數據作爲整數向下拉,然後將它們轉換爲客戶端上的DateTime。 – sgmoore

+2

您可以在模型中導入dbo.agent_datetime函數並使用它。 – Evk

回答

2

第一種選擇是使用dbo.agent_datetime在查詢中得到SQL datetime值(參見this example

如果你不能做到這一點,那麼你可以使用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