【发布时间】:2021-01-06 20:46:38
【问题描述】:
基本上我是在尝试根据用户的轮班和输入的天数来计算用户可以拥有的总小时数。
示例: 2020 年 9 月 13 日开始轮班。我知道这是第 1 周,星期日(基于其他计算)。 所以我需要在 ROTA 表中从周日取出 2,然后从第 2 周取出 3、2、1、1、1、2。
总共 7 天: 第 1 周 = 星期日 第 2 周 = 周一、周二、周三、周四、周五、周六
ROTA table
+------+-----+-----+-----+-----+-----+-----+-----+
| WEEK | MON | TUE | WED | THU | FRI | SAT | SUN |
+------+-----+-----+-----+-----+-----+-----+-----+
| 1 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
| 2 | 3 | 2 | 1 | 1 | 1 | 2 | 1 |
| 3 | 1 | 2 | 1 | 1 | 1 | 1 | 1 |
| 4 | 1 | 1 | 1 | 1 | 2 | 1 | 1 |
| 5 | 1 | 1 | 2 | 1 | 1 | 1 | 1 |
+------+-----+-----+-----+-----+-----+-----+-----+
以上数字存储在 Shifts 表中。因此,对于我的 7 天,这 7 天的总小时数为 2、3、2、1、1、1、2 = 51.5 小时。
SHIFTS Table
+-------+-------+
| SHIFT | HOURS |
+-------+-------+
| 1 | 8.5 |
| 2 | 6 |
| 3 | 8 |
+-------+-------+
我正在执行 WHILE 循环来获取所需的周和列。因此,对于上面的示例,我只需要 ROTA 表中的 SUN 列。下一个循环将给我 MON - SAT。
起初我试图将两行合并在一起,然后我可以进行某种计数。所以有 3x SHIFT 2、1x SHIFT 3 和 3x SHIFT 1。然后我可以得到总小时数,但不知道该怎么做。
在我的查询完成的那一刻,我最终得到以下两行:
LOOP 1:
+-----+
| SUN |
+-----+
| 2 |
+-----+
LOOP 2:
+-----+-----+-----+-----+-----+-----+
| MON | TUE | WED | THU | FRI | SAT |
+-----+-----+-----+-----+-----+-----+
| 3 | 2 | 1 | 1 | 1 | 2 |
+-----+-----+-----+-----+-----+-----+
我已经把我的查询去掉了一点,但这是它的要点:
WHILE @cnt <= @totalDays
BEGIN
IF @dayOfWeek = 1 SET @columnList = 'SUN' ELSE
IF @tempTotalDays >= 7 SET @columnList = 'MON, TUE, WED, THU, FRI, SAT, SUN' ELSE
IF @tempTotalDays = 6 SET @columnList = 'MON, TUE, WED, THU, FRI, SAT' ELSE
IF @tempTotalDays = 5 SET @columnList = 'MON, TUE, WED, THU, FRI' ELSE
IF @tempTotalDays = 4 SET @columnList = 'MON, TUE, WED, THU' ELSE
IF @tempTotalDays = 3 SET @columnList = 'MON, TUE, WED' ELSE
IF @tempTotalDays = 2 SET @columnList = 'MON, TUE' ELSE
IF @tempTotalDays = 1 SET @columnList = 'MON'
SET @sqlCommand = 'select '+ @columnList +' from dbo.ROTA
where WEEK = @rotaWeek'
EXEC sp_executesql @sqlCommand, N'@rotaWeek nvarchar(75), @rotaWeek = @rotaWeek
END;
GO
如您所见,我快到了。我只是不知道如何获取我的结果并从 SHIFTS 表中选择小时数。任何帮助将不胜感激。
【问题讨论】:
-
SQL 是一种基于集合的语言。你不需要循环。在最坏的情况下,您可以将所有这些检查转换为查询的
SELECT部分中的单个CASE子句 -
感谢您的回复。如果我只是使用 SELECT,当我可能需要多次使用同一个 WEEK 行时它会如何工作?
-
你什么时候需要考虑一个星期多次?你的意思是第 5 周之后又是第 1 周,@totalDays 可以超过 35 天?
-
是的,正确。可能超过 35 天,在第 5 周之后会回到第 1 周
-
好的,我不清楚。我已经用递归查询更新了我的答案。
标签: sql-server tsql dynamic-sql sp-executesql