【发布时间】:2021-07-19 10:26:53
【问题描述】:
我正在尝试从两个表之间的一组时间和日期中获取特定格式。
数据库: MeetingTime 表具有从 MeetingTime.DayOfWeekId(外键)到表 DayOfWeek.Id(主键)的关系。示例查询:
select t.ClassId, d.Name, t.StartTime, t.EndTime
From MeetingTime t
Inner Join DaysOfWeek d on d.Id = t.DayOfWeekId
Where t.classId = 8
结果:
我希望这组数据的结果是一行,因为开始时间和结束时间是相同的。
09:00-15:35 M/T/W/Th/F
注意,上面的开始和结束时间,可以是上面的单独列,主要目标是显示每个分组时间的星期几。
我希望显示为 2 行:
07:35-14:15 M/T/W
08:00-14:15 周四/周五
最后,这个所有时间都不同的数据集:
将显示为 5 行:
13:48-14:48 M
15:48-16:48 时间
05:49-23:53 W
14:49-16:49 星期四
13:49-16:49 楼
我在分组时间方面没有取得多大成功。我确实想出了如何使用“Stuff”运算符将一周中的天数串联到一列中,但是在开始和结束时间的分组以及这一点上还没有得到任何结果。
连接和累积天数:
STUFF((SELECT '/ ' +
(CASE
WHEN d.[Name] = 'Thursday' THEN SUBSTRING(d.[Name], 1, 2)
WHEN d.[Name] = 'Sunday' THEN 'U'
WHEN d.[Name] != '' THEN SUBSTRING(d.[Name], 1, 1)
ELSE NULL
END)
FROM MeetingTime m
Inner Join [DayOfWeek] d on d.Id = m.DayOfWeekId
Where m.ClassId = class.Id
FOR XML PATH('')), 1, 1, '') [ClassSchedule]
我也不反对只返回行并在 C# 代码中处理数据操作,而是想看看 SQL 是否可以处理它。
【问题讨论】:
-
当你将天连接成一行时,天需要是连续的吗?例如,如果星期三有不同的时间,您希望它在第一行显示 M/Tu/Th/ri,在第二行显示 W,还是在三行显示 M/Tu、W、Th/F?此外,是否总是会在一周和整周(周一至周五)报告,还是会有所不同?最后 - 如果当天没有会议怎么办?
-
@seanb - 你的第一个问题,如果星期三有不同的时间,而其他所有时间都在同一时间,我只想要 2 行,就像你提到的那样“M/Tu/Th/ri 在一行上,W on第二”。对于您的第二个问题,不必在整个星期报告,因此例如可以只在周二和周四上课,而其他日子没有条目。所以如果一天没有会议,就没有条目。例如,该程序还允许您将周六和周日添加为会议时间,但实际上这永远不会发生,因为整个数据库中都没有。
-
用您正在使用的数据库标记您的问题。
-
我没有在我的问题中提供的另一条注释。如果有帮助,DayOfWeek 表中有一个日期 ID 字段。它是 1-7 = 周一至周日。
标签: concatenation grouping sql-server-2016 rollup stuff