代码之家  ›  专栏  ›  技术社区  ›  Lazloo Xp

获取SQL Server中的中间时间段[已关闭]

  •  -1
  • Lazloo Xp  · 技术社区  · 5 年前

    我想在中间连接状态的SQL中生成一个表。例如,我有下表

    状态\1状态\2开始日期\u v1结束日期\u v1开始日期\u 2结束日期\u v2
    ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————
    A B 2018年1月1日2018年7月31日2017年12月31日2018年1月31日
    A C 2018年1月1日2018年7月31日2018年2月1日2018年12月30日
    < /代码> 
    
    

    此表中有不同状态的开始和结束日期“状态1”和“状态2”。我想知道两个联合国的变化情况。所需的表为:

    状态\1状态\2开始日期结束日期
    ————————————————————————————————————————————————————————————————
    A B 2018年1月1日2018年1月31日
    A C 01FEB2018 2018年7月31日
    

    下图可能有助于理解问题:

    有人能帮忙吗?

    此表中有不同状态的开始和结束日期“状态1”和“状态2”。我想知道两个联合国的变化情况。所需的表格为:

    status_1    status_2    start_date  end_date
    -----------------------------------------------
    A           B           01Jan2018   31Jan2018
    A           C           01Feb2018   31Jul2018
    

    下图可能有助于理解问题: enter image description here

    有人能帮忙吗?

    1 回复  |  直到 5 年前
        1
  •  1
  •   Erik Blomgren    5 年前

    似乎你需要交叉时间段(?),这将通过查询结果中每个日期的简单“case-when-else”语句来解决。

    SELECT
        [status1],
        [status2],
        [start_date] = CASE WHEN [start_date_V1] < [start_date_2] THEN [start_date_V1] ELSE [start_date_2] END,
        [end_date] = CASE WHEN [end_date_v1] < [end_date_v2] THEN [end_date_v1] ELSE [end_date_v2] END
    FROM Table
    

    如果您有许多日期列(已知数量),则可以更清楚地键入以下内容。但是,要注意,如果您不知道自己在做什么,这样的子查询会极大地减慢您的查询速度。

    SELECT 
        Status1, 
        Status2,
        -- New Name         Name of custom group of values     Column1       Column2            Name of custom group of values
        --    |                         |                       |               |                       |
        [start_date] = (SELECT MAX(StartDate) FROM (VALUES (start_date_1), (start_date_2)) AS value(StartDate)),
        [end_date] = (SELECT MIN(EndDate) FROM (VALUES (end_date_1), (end_date_2)) AS value(EndDate))
    FROM Table