Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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_Function_Sql Server 2008_Datetime - Fatal编程技术网

SQL-创建关于最后一个门使用情况的报告

SQL-创建关于最后一个门使用情况的报告,sql,function,sql-server-2008,datetime,Sql,Function,Sql Server 2008,Datetime,我试图做一份报告,显示每天最后一次我们大楼的某扇门被打开 到目前为止,我得到的是一个函数,返回date(varchar(10)一个时间(varchar(5)),当我给它一个@datestart=datefrom时,我想开始一个报告(end date设置为GETDATE())和@id_door(我们在每个门的特定id下存储锁的日期和时间)。 看起来是这样的:最后一扇门时间(@DATESTART,@ID\u DOOR) 输出: 我的愿望是从@output表中选择*。我正在创建这样的表: DECLAR

我试图做一份报告,显示每天最后一次我们大楼的某扇门被打开

到目前为止,我得到的是一个函数,返回date(varchar(10)一个时间(varchar(5)),当我给它一个@datestart=datefrom时,我想开始一个报告(end date设置为GETDATE())和@id_door(我们在每个门的特定id下存储锁的日期和时间)。 看起来是这样的:最后一扇门时间(@DATESTART,@ID\u DOOR) 输出:

我的愿望是从@output表中选择*。我正在创建这样的表:

DECLARE @output TABLE (ID int IDENTITY(1,1) not null, Date VARCHAR(10)
 null, Door1 VARCHAR(5) NULL, Door2 VARCHAR(5) NULL, .... PRIMARY KEY (ID))

DECLARE @DATESTART DATE = 'some date'
DECLARE @DATEEND DATE = GETDATE()

WHILE ( @DATESTART < @DATEEND )
BEGIN
    INSERT INTO @output (Date) VALUES( @DATESTART )
    SELECT @DATESTART = DATEADD(DAY, 1, @DATESTART )
END

+----+-------------+-------+--------+
| id |    Date     | Door1 | Door2  |
+----+-------------+-------+--------+
|  1 |  28.06.2017 |       |        |
+----+-------------+-------+--------+ 
|  2 |  29.06.2017 |       |        |
+----+-------------+-------+--------+ 
|  3 |  30.06.2017 |       |        |
+----+-------------+-------+--------+ 
接下来,我得到了内部文件

+-------------+--------+-------------+---------+
|   ID_INT    | ID_EMP | ID_BUILDING | ID_DOOR |
+-------------+--------+-------------+---------+
|  1          | 1      | 3           |  10     |
+-------------+--------+-------------+---------+
|  2          | 1      | 3           |  10     |
+-------------+--------+-------------+---------+
为了从中获得相关信息,我必须在int_id上将这两个连接在一起,以获得正确的门和正确的时间。我将此连接的输出放入@Temp表中,然后使用select和INTERNAL连接来获得每天的最大时间

Select DATE=convert(varchar(10),a.DATE_NAV,104), TIME=convert(varchar(5),R.MAXTIME,108) 
from
(select max(DATE_NAV) as maxtime from @Temp group by day([DATE_NAV])) R
inner join  @Temp a on R.MAXTIME=A.DATE_NAV
order by R.MAXTIME asc

这就是上次函数的全部内容。

使用这些源表:

declare @AMB_DOOR table(id_INT int,date_nav datetime)

insert into @AMB_DOOR values (1, '2016-01-01 16:50')
insert into @AMB_DOOR values (2, '2016-01-01 17:20')
insert into @AMB_DOOR values (3, '2016-01-01 16:53')
insert into @AMB_DOOR values (4, '2016-01-01 17:21')

declare @INTERNAL_DOC table(id_INT int,id_EMP int,id_BUILDING int,id_DOOR int)

insert into @INTERNAL_DOC values (1,1,2,10)
insert into @INTERNAL_DOC values (2,1,3,10)
insert into @INTERNAL_DOC values (3,1,2,20)
insert into @INTERNAL_DOC values (4,1,3,20)
你可以得到你所需要的如下

 select 
      id_door,
      convert(date, date_nav) as [Date], 
      max(convert(varchar(8), convert(time, date_nav))) as Maxtime

  from
      @AMB_DOOR t1 left join @INTERNAL_DOC t2 on t1.id_int=t2.id_INT
  group by 
      id_door, 
      convert(date, date_nav) 
给予


请发布您的源表,我认为您已经陷入了一个不需要的兔子洞。看起来您正在将其视为一个过程编程问题,而不是关系数据库问题。添加源数据。编辑答案,这应该可以解决问题。如果您想转轴它,我建议使用您的报告工具来完成此操作如果可能,因为纯TSQL中的动态枢轴非常复杂。
declare @AMB_DOOR table(id_INT int,date_nav datetime)

insert into @AMB_DOOR values (1, '2016-01-01 16:50')
insert into @AMB_DOOR values (2, '2016-01-01 17:20')
insert into @AMB_DOOR values (3, '2016-01-01 16:53')
insert into @AMB_DOOR values (4, '2016-01-01 17:21')

declare @INTERNAL_DOC table(id_INT int,id_EMP int,id_BUILDING int,id_DOOR int)

insert into @INTERNAL_DOC values (1,1,2,10)
insert into @INTERNAL_DOC values (2,1,3,10)
insert into @INTERNAL_DOC values (3,1,2,20)
insert into @INTERNAL_DOC values (4,1,3,20)
 select 
      id_door,
      convert(date, date_nav) as [Date], 
      max(convert(varchar(8), convert(time, date_nav))) as Maxtime

  from
      @AMB_DOOR t1 left join @INTERNAL_DOC t2 on t1.id_int=t2.id_INT
  group by 
      id_door, 
      convert(date, date_nav) 
ID_DOOR DATE        MAXTIME
10      2016-01-01  17:20:00
20      2016-01-01  17:21:00