【发布时间】: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