Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在LINQ中将INT表示的时间和日期转换为DateTime结构_C#_Sql Server_Linq_Entity Framework 6 - Fatal编程技术网

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函数并使用它。