2016-04-29 19 views
0

我有給我輸出SQL如何確定從日期每天和工作站

select distinct(d.data_name) ,h.workstation_name, h.type_id, convert(varchar(19),(h.insert_date),120) as start 
from data d, process_data_history h 
where h.data_id = d.data_id 
and h.type_id between '500' and '5001' 
and h.workstation_name like 'PL1W7D-105120' 
and CONVERT(VARCHAR(25), h.insert_date, 126) LIKE '2016-04%' 
order by d.data_name, start ; 

和輸出的查詢看起來像這樣

data_name      workstation_name type_id  start 
WE228JP_2016_04_05__10_03_03 PL1W7D-105120 500  2016-04-05 12:45:38 
WE228JP_2016_04_05__10_03_03 PL1W7D-105120 501  2016-04-05 12:45:38 
WE228JP_2016_04_05__10_03_03 PL1W7D-105120 600  2016-04-05 12:45:39 
WE228JP_2016_04_05__10_03_03 PL1W7D-105120 601  2016-04-05 12:45:39 
WE228JP_2016_04_05__10_03_03 PL1W7D-105120 4001 2016-04-05 14:06:04 
WE228JP_2016_04_05__10_03_03 PL1W7D-105120 4000 2016-04-05 14:05:55 
WE228JP_2016_04_05__10_03_03 PL1W7D-105120 4100 2016-04-05 14:06:05 
WE228JP_2016_04_05__10_03_03 PL1W7D-105120 4101 2016-04-05 14:10:43 
WE228JP_2016_04_05__10_03_03 PL1W7D-105120 5000 2016-04-05 14:10:43 
WE228JP_2016_04_05__10_03_03 PL1W7D-105120 5001 2016-04-05 14:10:45 
WE228JP_2016_04_06__10_33_03 PL1W7D-105120 500  2016-04-06 14:10:46 
WE228JP_2016_04_06__10_33_03 PL1W7D-105120 600  2016-04-06 14:10:47 
WE228JP_2016_04_06__10_33_03 PL1W7D-105120 501  2016-04-06 14:10:47 
WE228JP_2016_04_06__10_33_03 PL1W7D-105120 601  2016-04-06 14:10:48 
WE228JP_2016_04_06__10_33_03 PL1W7D-105120 4000 2016-04-06 15:30:07 
WE228JP_2016_04_06__10_33_03 PL1W7D-105120 4001 2016-04-06 15:30:18 
WE228JP_2016_04_06__10_33_03 PL1W7D-105120 4100 2016-04-06 15:30:18 
WE228JP_2016_04_06__10_33_03 PL1W7D-105120 4101 2016-04-06 15:35:01 
WE228JP_2016_04_06__10_33_03 PL1W7D-105120 5000 2016-04-06 15:35:01 
WE228JP_2016_04_06__10_33_03 PL1W7D-105120 5001 2016-04-06 15:35:03 
WE228JP_2016_04_15__10_03_03 PL1W7D-105122 500  2016-04-05 12:45:38 
WE228JP_2016_04_15__10_03_03 PL1W7D-105122 501  2016-04-05 12:45:38 
WE228JP_2016_04_15__10_03_03 PL1W7D-105122 600  2016-04-05 12:45:39 
WE228JP_2016_04_15__10_03_03 PL1W7D-105120 601  2016-04-05 12:45:39 
WE228JP_2016_04_15__10_03_03 PL1W7D-105122 4001 2016-04-05 14:06:04 
WE228JP_2016_04_15__10_03_03 PL1W7D-105122 5000 2016-04-05 14:10:43 
WE228JP_2016_04_15__10_03_03 PL1W7D-105122 5001 2016-04-05 14:10:45 

而且我知道時間是

ID 500 600 ... 5000表示步驟(程序)的開始時間

ID 501 601 ... 5001表示結束步驟時間(計劃)

所以我需要知道的是,每天工作站多久工作:

因此所需的輸出會是這樣的(它的例子):

data_name      workstation_name  Hours 
2016-04-05     PL1W7D-105120  22 hours 
2016-04-06     PL1W7D-105120  21 hours 
2016-04-15     PL1W7D-105122  17 hours 

任何暗示如何我可以做到?任何事情都會做;)

回答

2

我想你只是想聚集。這裏有一個方法:

select d.data_name, h.workstation_name, h.type_id, 
     datediff(hour, min(insert_date), max(insert_date)) as hours_sortof 
from data d join 
    process_data_history h 
    on h.data_id = d.data_id 
where h.type_id between '500' and '5001' and 
     h.workstation_name like 'PL1W7D-105120' 
     h.insert_date >= '2016-04-01' and h.insert_date < '2016-05-01' 
group by d.date_name, h.workstation_name, 
order by d.data_name, start ; 

注:

  • 學習使用明確JOIN語法。 從不FROM條款中使用逗號。
  • 爲了比較目的,不要將日期轉換爲字符串。 SQL Server內置了非常好的日期/時間功能。
  • 僅在字符串常量上使用LIKE。隱式轉換可能是問題的主要來源。
  • hours_sortof基於SQL Server如何處理時間差異。它計算小時邊界而不是實際小時數。要獲得更多細化,請使用較小的增量,例如分鐘或秒。
+0

這是一個很好的方法。我會牢記在心。謝謝 :)! –

0

把你的輸出數據放到一個表(或臨時表),那麼這應該工作。你的數據有一個事件在它結束之前開始!

;with x as 
(
    select data_name, workstation_name, event_id = type_id/10, endEventIndicator = type_id%10, timestamp = start 
from Data 
) 
select Date = cast(starts.timestamp as date), starts.workstation_name, sum(DateDiff(hour, starts.timestamp, ends.timestamp)) 
from x starts inner join x as ends 
on starts.event_id = ends.event_id 
and starts.endEventIndicator = 0 and ends.endEventIndicator = 1 
and starts.workstation_name = ends.workstation_name 
group by cast(starts.timestamp as date), starts.workstation_name 
+0

我會嘗試測試它,但我不確定我是否有能力做到這一點:)將會看到。 –

相關問題