我在最初的图像中有一个初始查询结果。
select
rpt_mem.Member_Full_Name as Member,
rpt_mem.Email_Address as [Work Email],
CONVERT(VARCHAR(10), Date_Time_Start, 101) as [Shift Start Date],
MIN(CONVERT(VARCHAR(5), Date_Time_Start, 108)) as [Shift Start Time],
CONVERT(VARCHAR(10), Date_Time_End, 101) as [Shift End Date],
MAX(CONVERT(VARCHAR(5), Date_Time_End, 108)) as [Shift End Time]
from Schedule
where rpt_mem.Member_Full_Name = 'Member1'
AND CONVERT(VARCHAR(10), Date_Time_Start, 101) = '10/04/2020'
如何修改查询以仅获取第一个班次开始时间和最后一个结束时间(如第二张图片)
答案 0 :(得分:0)
您只需要group by
和Date_Time_Start
的日期部分。
Date_Time_End
哪个返回:
declare @Schedule table (Member varchar(8), Date_Time_Start datetime2(0), Date_Time_End datetime2(0))
insert into @Schedule (Member, Date_Time_Start, Date_Time_End)
values
('Member 1', '10 Apr 2020 12:00:00', '10 Apr 2020 14:00')
, ('Member 1', '10 Apr 2020 17:00:00', '10 Apr 2020 18:00')
select
, CONVERT(VARCHAR(10), convert(date,S.Date_Time_Start), 101) as [Shift Start Date]
, CONVERT(VARCHAR(5), MIN(S.Date_Time_Start), 108) as [Shift Start Time]
, CONVERT(VARCHAR(10), convert(date,S.Date_Time_Start), 101) as [Shift End Date]
, CONVERT(VARCHAR(5), MAX(S.Date_Time_End), 108) as [Shift End Time]
from @Schedule S
where S.Member in ('Member 1')
--AND CONVERT(VARCHAR(10), Date_Time_Start, 101) = '10/04/2020'
-- Sargeable i.e. can make use of indexes.
AND S.Date_Time_Start >= '10 Apr 2020'
AND S.Date_Time_Start < '11 Apr 2020'
group by S.Member, convert(date,S.Date_Time_Start), convert(date,S.Date_Time_End);
注意:
您不想在Member Shift Start Date Shift Start Time Shift End Date Shift End Time
Member 1 04/10/2020 12:00 04/10/2020 18:00
子句中转换Date_Time_Start
,因为它不可更改。而是使用窗口条件。
您想养成使用明确日期格式的习惯。
该查询将使您可以运行多天,并且如果需要,可以有多个成员。您只需要添加任何其他成员信息列,例如通过电子邮件发送到where
。
如果您使用如图所示的DDL / DML语句设置测试数据,则可以使人们更轻松地回答您的问题。
答案 1 :(得分:0)
您也可以-
select
rpt_mem.Member_Full_Name as Member,
rpt_mem.Email_Address as [Work Email],
CONVERT(VARCHAR(10), MIN(Date_Time_Start), 101) as [Shift Start Date],
CONVERT(VARCHAR(5), MIN(Date_Time_Start), 108) as [Shift Start Time],
CONVERT(VARCHAR(10), MAX(Date_Time_End), 101) as [Shift End Date],
CONVERT(VARCHAR(5), MAX(Date_Time_End), 108) as [Shift End Time]
from Schedule rpt_mem
where rpt_mem.Member_Full_Name = 'Member1'
AND CONVERT(VARCHAR(10), Date_Time_Start, 101) = '04/10/2020'
GROUP BY
rpt_mem.Member_Full_Name,
rpt_mem.Email_Address;
这是数据库提琴琴链接-https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=61da8cab5471d21818eb5b7fec8d509c