【问题标题】:SQL - creating a report about last door usageSQL - 创建关于最后一扇门使用情况的报告
【发布时间】:2017-12-04 06:25:06
【问题描述】:

我正在尝试制作一份报告,显示我们大楼中某扇门每天最后一次打开的时间。

到目前为止,我得到的是一个函数,当我给它一个@datestart =我想开始报告的日期(结束日期设置为GETDATE)时,它返回日期(varchar(10)一次(varchar(5)) ()) 和@id_door(我们存储每个门的特定ID 下的锁的日期和时间)。 看起来像这样:LAST_DOOR_TIME (@DATESTART, @ID_DOOR) 输出:

+-------------+--------+
|   DATE      | TIME   | 
+-------------+--------+
|  28.06.2017 | 22:30  | 
+-------------+--------+
|  29.06.2017 | 21:30  | 
+-------------+--------+

我的愿望是从@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 的门,并在 WHILE 条件下使用它,并且在每次通过它时都会更改函数中的 @ID_DOOR。

我真正苦苦挣扎的是如何将函数的输出插入到@output 表中,以便匹配正确的列和日期。

感谢您的任何建议。

好的,我的源表是: Amb_door - 保存门打开时间的表。

+-------------+----------------------+
|   ID_INT    | DATE_NAV             | 
+-------------+----------------------+
|  1          | 2012-06-28 11:00:00  | 
+-------------+----------------------+
|  2          | 2012-06-28 11:10:00  | 
+-------------+----------------------+

接下来我得到了 internal_doc

+-------------+--------+-------------+---------+
|   ID_INT    | ID_EMP | ID_BUILDING | ID_DOOR |
+-------------+--------+-------------+---------+
|  1          | 1      | 3           |  10     |
+-------------+--------+-------------+---------+
|  2          | 1      | 3           |  10     |
+-------------+--------+-------------+---------+

为了从中获得相关信息,我必须在 int_id 上加入这两个,以获得正确的门和正确的时间。我将此连接的输出放入 @Temp 表中,然后使用带有内部连接的 select 来获得每天的最大时间。

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

这就是函数 LAST_DOOR_TIME 的全部内容。

【问题讨论】:

  • 请发布您的源表,我认为您已经进入了一个您不需要的兔子洞。看起来您将其视为过程编程问题而不是关系数据库问题。
  • 添加源数据。
  • 已编辑答案,应该可以解决问题。

标签: sql function sql-server-2008 datetime


【解决方案1】:

使用这些源表:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 2016-09-11
  • 2010-11-13
  • 1970-01-01
相关资源
最近更新 更多