获取第一个开始时间和最后一个结束时间

时间:2020-10-05 00:20:45

标签: sql sql-server tsql group-by

我在最初的图像中有一个初始查询结果。

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'

Query result

如何修改查询以仅获取第一个班次开始时间和最后一个结束时间(如第二张图片)

target result

2 个答案:

答案 0 :(得分:0)

您只需要group byDate_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);

注意:

  1. 您不想在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,因为它不可更改。而是使用窗口条件。

  2. 您想养成使用明确日期格式的习惯。

  3. 该查询将使您可以运行多天,并且如果需要,可以有多个成员。您只需要添加任何其他成员信息列,例如通过电子邮件发送到where

  4. 如果您使用如图所示的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

相关问题