【问题标题】:SQL Server: WHILE Within SELECT?SQL Server:在 SELECT 中的 WHILE?
【发布时间】:2015-05-31 00:49:09
【问题描述】:

作为通过 SQL Server 2012 的报表生成器构建的报表的一部分,我试图衡量它“正式”花费工人完成各种任务的时间。在我的 Task 表中,我有一个 Task Created datetime 字段、一个 Task Resolved datetime 字段,并且我还有其他表用于它们的计时开/关时间,我可以从中获取数据。

我只想根据他们应该工作的时间来衡量。所以它不包括他们不工作的通宵时间,这意味着它不是那么简单

DATEDIFF(minutes,TaskCreated,TaskResolved).

我发现的一种方法是将他们每天花费多少小时作为单独的字段,并将这些字段相加:

Created          |Resolved         |Day1time|Day2time |Day3time |TotalTime
14/04/2015 20:00 |16/04/2015 10:00 |01:00:00|12:00:00 |01:00:00 |14:00:00

不幸的是,我不知道完成某项工作需要多长时间才能解决这个问题,所以我不知道需要使用多少字段,但代码显然是重复的,因此很糟糕,尤其是如果作业可能需要一个月或更长时间才能完成。

作为一个比 SQL 更熟悉 Java 和 C++ 等编程语言的人,在我看来,将创建和解析作为参数、每天进行一个循环以及增加当天停机时间的变量作为一个函数会更好.不幸的是,我似乎没有创建临时函数的权限,所以我想知道是否可以在 Select 语句中执行 while 循环来计算时间?我试过了这样做,但代码验证器说它无效。

抱歉,我没有任何代码来帮助解释我目前正在尝试做的事情,因为我离开了我的工作电脑,但最终我想要这样的东西:

Created          | Resolved         | Time Taken | Priority | Worker
01/01/2015 12:00 | 01/01/2015 13:00 | 01:00:00   | A        | C Forbes
02/03/2015 20:00 | 03/03/2015 11:00 | 03:00:00   | B        | J Flansburgh
31/05/2015 18:50 | 01/05/2015 10:50 | 00:10:00   | D        | E Idle
14/04/2015 20:00 | 16/04/2015 10:00 | 14:00:00   | D        | A Ng

C 福布斯 - 标准工作 - datediff 可以在这里工作

J Flansburgh - 工人在工作日 21:00 结束,09:00 开始,因此第 1 天 1 小时 + 第 2 天 2 小时 = 总共 3 小时

E 空闲 - 周日 19:00 完成,并在他应该在周一正式开始之前完成工作。 31 日星期日 10 分钟,星期一 1 日 0 分钟 = 10 分钟

A Ng:工作日 21:00 结束,09:00 开始... 14 日 1 小时+15 日 12 小时+16 日 1 小时 = 总共 14 小时

我在输入这个问题时的另一个想法是做一个 while 循环,一次从表中取出一行,从该单独的行中计算出时间,然后将每一行附加到一个新表中。这样会更好吗?

提前感谢任何试图提供帮助的人。

【问题讨论】:

    标签: datetime while-loop sql-server-2012 subquery reportbuilder3.0


    【解决方案1】:

    我会说这取决于您的另一个表中包含开/关时间的内容。假设您可以根据任务(和工作人员?)在两个表之间进行连接,我认为您应该能够执行以下操作:

    SELECT tasks.Id, tasks.Created, tasks.Resolved,  SUM(DATEDIFF(minutes,timesheet.end, timesheet.start) as [Time Taken], tasks.Priority, tasks.Worker
    FROM tasks
       INNER JOIN timesheet on tasks.Id = timesheet.TaskId and tasks.Worker = timesheet.Worker
    GROUP BY tasks.Id, tasks.Created, tasks.Resolved, tasks.Priority, tasks.Worker
    

    【讨论】:

    • 确实有一些我正在做的报告对这个问题有不同的看法。对于那些与工程师直接相关的人,他们都工作相同的班次模式,这只是在周日有所不同,所以我一直在使用带有 datepart 公式的案例来检查是否是周日,然后从那里开始工作。我必须做的第一份报告做是基于进入地方的,例如设置了一周的桌子。 ... 周四 09:00 17:00,周五 09:00 17:00,周六 10:00 20:00,周日休息 休息。现在在我的手机上,抱歉格式化。
    猜你喜欢
    • 1970-01-01
    • 2012-08-30
    • 2011-05-31
    • 1970-01-01
    • 2019-03-09
    • 2014-09-08
    • 2013-02-17
    • 2020-03-01
    • 1970-01-01
    相关资源
    最近更新 更多