Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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
SQL如何从每天的日期和工作站确定小时数_Sql_Sql Server 2008_Date - Fatal编程技术网

SQL如何从每天的日期和工作站确定小时数

SQL如何从每天的日期和工作站确定小时数,sql,sql-server-2008,date,Sql,Sql Server 2008,Date,我有一个查询,它给出了我的输出 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_n

我有一个查询,它给出了我的输出

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表示步骤(程序)的结束时间

所以我需要知道工作站每天工作多长时间:

因此,所需的输出如下(示例):


有没有暗示我该怎么做?什么都行;)

我想你只是想要聚合。这里有一种方法:

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 ;
选择d.数据\u名称、h.工作站\u名称、h.类型\u id、,
datediff(小时,最小值(插入日期),最大值(插入日期))作为小时数
从数据d连接
处理\u数据\u历史记录
关于h.data\u id=d.data\u id
其中h.type_id介于“500”和“5001”之间,并且
h、 工作站名称,如“PL1W7D-105120”
h、 插入日期>='2016-04-01'和h。插入日期<'2016-05-01'
按d.日期\名称、h.工作站\名称分组,
按d.data_名称排序,开始;
注:

  • 学习使用显式
    JOIN
    语法。切勿在
    FROM
    子句中使用逗号
  • 不要出于比较目的将日期转换为字符串。SQL Server在系统中内置了非常好的日期/时间功能
  • 仅对字符串常量使用
    LIKE
    。隐式转换可能是问题的主要来源
  • hours\u sortof
    基于SQL Server处理时间差异的方式。它计算小时界限,而不是实际的小时数。要进行更多细化,请使用较小的增量,如分钟或秒

    • 我想你只是想要聚合。这里有一种方法:

      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 ;
      
      选择d.数据\u名称、h.工作站\u名称、h.类型\u id、,
      datediff(小时,最小值(插入日期),最大值(插入日期))作为小时数
      从数据d连接
      处理\u数据\u历史记录
      关于h.data\u id=d.data\u id
      其中h.type_id介于“500”和“5001”之间,并且
      h、 工作站名称,如“PL1W7D-105120”
      h、 插入日期>='2016-04-01'和h。插入日期<'2016-05-01'
      按d.日期\名称、h.工作站\名称分组,
      按d.data_名称排序,开始;
      
      注:

      • 学习使用显式
        JOIN
        语法。切勿在
        FROM
        子句中使用逗号
      • 不要出于比较目的将日期转换为字符串。SQL Server在系统中内置了非常好的日期/时间功能
      • 仅对字符串常量使用
        LIKE
        。隐式转换可能是问题的主要来源
      • hours\u sortof
        基于SQL Server处理时间差异的方式。它计算小时界限,而不是实际的小时数。要进行更多细化,请使用较小的增量,如分钟或秒

      将输出数据放入一个表(或临时表),这样就可以了。您的数据有一个在结束之前开始的事件

      ;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
      

      将输出数据放入一个表(或临时表)中,这样就可以了。您的数据有一个在结束之前开始的事件

      ;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
      

      我会尝试测试它,但我不确定我是否有能力做到这一点:)将看到。我会尝试测试它,但我不确定我是否有能力做到这一点:)将看到。