C# 在LINQ中将INT表示的时间和日期转换为DateTime结构
我目前正在查询C# 在LINQ中将INT表示的时间和日期转换为DateTime结构,c#,sql-server,linq,entity-framework-6,C#,Sql Server,Linq,Entity Framework 6,我目前正在查询msdb.dbo.sysjobhistory表,以查找今天执行的作业的状态,并在浏览器中显示它们。此表的定义如下所示。 这里的run\u date和run\u time对应于执行特定作业的日期和时间,当然这两者都表示为int。我正试图从这些属性构造一个DateTime类型,以便在单个列中查看它,而不是在两个单独的列中查看它 示例 run_date = 20161125 run_time = 33000 runStartTime = 2016-11-25 03:30:00 我定
msdb.dbo.sysjobhistory
表,以查找今天执行的作业的状态,并在浏览器中显示它们。此表的定义如下所示。
这里的run\u date
和run\u 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();
}
}
private异步任务getExecutedJobs()
{
使用(var context=new SysTableEntity())
{
返回等待(来自context.sysjobs中的作业)
在context.sysjobhistories中加入历史记录
on job.job\u id等于history.job\u id
选择新执行的作业视图模型
{
jobName=job.name,
message=history.message,
步骤id=历史记录。步骤id,
步骤名称=历史记录。步骤名称,
runStatus=history.run\u status,
runDuration=history.run\u duration,
runStartTime=//在此处绑定数据
}).ToListAsync();
}
}
我能想到的唯一解决方案是DbFunctions.CreateDateTime(int?years, 整数月,整数天,整数小时,整数分钟, int?秒)
这项工作太多,因为int
必须转换为字符串,然后找到子字符串,然后再转换回int
。另外,处理边缘大小写,如33000
,它是五位数字,而时间是六位数字(183000
)
您能否建议一种更简单的方法来实现这一点。您的第一个选择是在查询中使用dbo.agent\u 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
将数据作为整数向下拉,然后在客户端将其转换为日期时间。您可以在模型中导入dbo.agent\u DateTime函数并使用它。