2013-04-03 6 views
1

У меня есть таблица SO_STATUS, которая записывает запись для каждого изменения статуса для заказа на обслуживание (мы будем называть Service_Order_ID «Job_ID»). Job_ID ссылается на таблицу SERVICE_ORDER. Когда инициализируется заказ на обслуживание, запись записывается для этого типа статуса «open» (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 

Как бы я идти о получении этого выхода? Спасибо.

ответ

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

Также по этой ссылке, чтобы получить различные exmples:

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

Надеюсь, вы станете дальше там, где условия.

0

Вы можете использовать DATEDIFF вернуть счетчик (знаковое целое число) из указанных границ DATEPART скрещенных между указанной StartDate и EndDate (см 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

Я создал пользовательский код, чтобы создать разницу Дат и время, используя функцию 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

Try запрос ниже:

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

Разница между двумя датами разных таблиц, в которых имеет DATETIME формат.

ВЫБОР t1.Column_Names,

ПРЕОБРАЗОВАНИЯ (VARCHAR (10), t1.CreatedOn, 103)

КАК CreatedOn ОТ table1 t1 INNER JOIN t2 table2

ПО t1.id = t2.id ГДЕ CAST (t1.CreatedOn как дата)

МЕЖДУ @fromdate и @todate.

Я принял t1.CreatedOn как атрибут таблицы, который содержит дату.

@fromdate и @todate для передачи дат.

Смежные вопросы