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

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

4

7 回答 7

2

你为什么不使用:

SELECT DATEDIFF (anyparticularunit, ' 2012-01-01 09:05:00.000', ' 2012-01-01 15:00:00.000')

通过以下链接查看 datediff:

http://msdn.microsoft.com/en-us/library/ms189794.aspx

还可以按照此链接获取不同的示例:

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=56126

希望你能进一步提出条件。

于 2013-04-03T06:48:55.057 回答
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
于 2013-04-04T11:45:40.740 回答
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
于 2013-04-03T07:23:16.707 回答
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 .....
于 2013-04-03T07:15:44.213 回答
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
于 2013-04-03T07:17:39.350 回答
0

您可以使用 DATEDIFF 返回指定的开始日期和结束日期之间交叉的指定日期部分边界的计数(有符号整数)(请参阅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
于 2013-04-03T06:51:56.423 回答
0

具有日期时间格式的不同表的两个日期之间的差异。

选择 t1.Column_Names,

转换(varchar(10),t1.CreatedOn,103)

AS CreatedOn FROM table1 t1 INNER JOIN table2 t2

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

在@fromdate 和@todate 之间。

我已将 t1.CreatedOn 作为保存日期的表属性。

@fromdate 和 @todate 传递日期。

于 2016-08-24T10:42:08.560 回答