【问题标题】:Get the first start time and last end time获取第一个开始时间和最后一个结束时间
【发布时间】:2021-01-19 20:59:37
【问题描述】:

我在第一张图片中有一个初始查询结果。

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'

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

【问题讨论】:

  • 数据最好在本网站上显示为格式化文本。图像对每个人来说都是一种痛苦。

标签: sql sql-server tsql group-by


【解决方案1】:

你也可以这样做-

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;

这是一个 db fiddle 链接 - https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=61da8cab5471d21818eb5b7fec8d509c

【讨论】:

    【解决方案2】:

    您只需要group by Date_Time_StartDate_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
    

    注意事项:

    1. 您不想在where 子句中转换您的Date_Time_Start,因为它是不可分割的。而是使用窗口条件。

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

    3. 如果您愿意,此查询将允许您运行多天和多个成员。您只需要添加任何其他成员信息列,例如电邮至group by

    4. 如果您使用 DDL/DML 语句设置测试数据,如图所示,您可以让人们更容易回答您的问题。

    【讨论】:

    • 感谢@Dale K 指出一些项目。将尝试这个并审查。
    猜你喜欢
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 2019-09-26
    • 1970-01-01
    • 2021-12-14
    • 2016-02-03
    • 1970-01-01
    相关资源
    最近更新 更多