2013-04-03 106 views
1

我有一张SO_STATUS表,它为服务订单的每个状态更改(我们将调用Service_Order_ID“Job_ID”)写入一条记录。 Job_ID引用SERVICE_ORDER表。当服务订单被初始化时,将为该状态类型“打开”(StatusType 2)写入一条记录,该记录显示日期时间。然后在状态表中写入另一条记录,以便它处于“进行中”状态(StatusType 1)。另外,当服务订单“关闭”时,另一条记录写入状态表(StatusType 3)。还有其他地位类型可能会发生,但这些是最常见的。在SO_STATUS表中的数据是这样的:如何找到同一列中两个日期之间的差异?

id   Date    Job_ID StatusTypeID EmployeeID 
1  2012-01-01 09:05:00.000  51  2    5 
2  2012-01-01 10:00:00.000  52  2   12 
3  2012-01-01 10:01:00.000  51  1    5 
4  2012-01-01 12:15:00.000  53  2    8 
5  2012-01-01 12:16:00.000  51  3    5 
6  2012-01-01 13:00:00.000  52  1   12 
7  2012-01-01 14:00:00.000  52  3   12 
8  2012-01-01 14:15:00.000  53  1    8 
9  2012-01-01 15:00:00.000  54  2   11 
10 2012-01-01 16:30:00.000  53  3    8 
11 2012-01-01 15:00:00.000  54  1   11 
12 2012-01-01 16:30:00.000  54  3   11 

我需要能够找到每个JOB_ID的每一个状态变化之间的时间间隔。本质上,从开放到结束工作的时间长短。

输出会看起来像(EmployeeName会从EMPLOYEE表引用):

Job_ID  Duration EmployeeName 
    51   03:11:00  Kyle 
    52   04:00:00  Chris 
    53   04:15:00  Fred 
    54   01:30:00  John 

我将如何去获得这种类型的输出?谢谢。

回答

0

您可以使用DATEDIFF返回指定的开始日期和结束日期之间越过指定datepart边界的计数(带符号的整数)(见http://msdn.microsoft.com/en-us/library/ms189794.aspx

SELECT Job_ID, 
DATEDIFF(day, (SELECT MIN(Date) FROM YOUTABLE WHERE Job_ID=k.Job_ID),(SELECT MAX(Date) FROM YOUTABLE WHERE Job_ID=k.Job_ID)), 
(SELECT EmployeeName FROM EmployeeTABLE WHERE EmployeeID=k.EmployeeID)) FROM YOUTABLE k 
0

如果你的数据库是Oracle,你可以这样做

SELECT DISTINCT JOB_ID, MAX(DATE) OVER(PARTITION BY JOB_ID)-MIN(DATE) OVER(PARTITION BY JOB_ID) AS Duration FROM TA JOIN TB ..... 
0

我已创建一些自定义代码来创建的DAT和时间差,使用DATEDIFF函数和与某些数字除以生成小时,分钟和秒:

SELECT 
    Job_ID, 
    CAST(DATEDIFF(second, MIN(Date), MAX(Date))/3600 AS VARCHAR) 
    + ':' + CAST((DATEDIFF(second, MIN(Date), MAX(Date)) % 3600)/60 AS VARCHAR) 
    + ':' + CAST(((DATEDIFF(second, MIN(Date), MAX(Date)) % 3600) % 60) AS VARCHAR) 
FROM YOUTABLE 
GROUP BY Job_ID 
0

尝试查询如下:

Select t1.Job_ID, 
Convert(varchar(5),DateDiff(HH,Min(t1.JobDate),tbl.MaxDate))+' : '+convert(varchar(5),DateDiff(s,Min(t1.JobDate),tbl.MaxDate) % 3600/60)+' : '+Convert(varchar(5),DateDiff(s,Min(t1.JobDate), 
tbl.MaxDate) % 60) MinDate,t1.EmployeeName From SO_STATUS t1 
Inner join (Select Max(JobDate) MaxDate, job_id From SO_STATUS Group By Job_Id)tbl on t1.Job_ID=tbl.Job_ID 
Inner Join EMPLOYEE e On e.EmployeeID=t1.EmployeeID 
Group By t1.EmployeeName,tbl.MaxDate,t1.Job_ID 
Order By t1.Job_ID 
1

这这一个 - 日期具有日期时间格式不同表的

SET NOCOUNT ON; 

DECLARE @duration TABLE 
(
     id BIGINT IDENTITY 
    , [date] DATETIME 
    , job_id INT 
    , [status] VARCHAR(10) 
    , employee_id INT 
) 

INSERT INTO @duration ([date], job_id, [status], employee_id) 
VALUES 
    ('2012-01-01 09:05:00.000', 51, 'open', 5), 
    ('2012-01-01 10:00:00.000', 52, 'open', 12), 
    ('2012-01-01 10:01:00.000', 51, 'inprogress', 5), 
    ('2012-01-01 12:15:00.000', 53, 'open', 8), 
    ('2012-01-01 12:16:00.000', 51, 'closed', 5), 
    ('2012-01-01 13:00:00.000', 52, 'inprogress', 12), 
    ('2012-01-01 14:00:00.000', 52, 'closed', 12), 
    ('2012-01-01 14:15:00.000', 53, 'inprogress', 8), 
    ('2012-01-01 15:00:00.000', 54, 'open', 11), 
    ('2012-01-01 16:30:00.000', 53, 'closed', 8), 
    ('2012-01-01 15:00:00.000', 54, 'inprogress', 11), 
    ('2012-01-01 16:30:00.000', 54, 'closed', 11) 

SELECT 
     job_id 
    , employee_id 
    , work_time = CONVERT(VARCHAR(12), MAX([date]) - MIN([date]), 114) 
FROM @duration 
GROUP BY job_id, employee_id 
0

差异之间的两个。

SELECT t1.Column_Names,

CONVERT(VARCHAR(10),T1。CreatedOn,103)

AS CreatedOn FROM表1 T1 INNER JOIN table2的T2

ON t1.id = t2.id WHERE CAST(t1.CreatedOn如日期)

BETWEEN @fromdate和@todate。

我已经采取t1.CreatedOn作为我的表格属性持有日期。

@fromdate和@todate传递日期。