获取 SQL 服务器中的中间时间段

Get intermediate time periods in SQL Server

我想在 SQL 个中间连接状态中生成一个 table。例如。我有以下 table

status_1    status_2    start_date_V1   end_date_v1 start_date_2    end_date_v2
--------------------------------------------------------------------------------
A           B            01Jan2018      31Jul2018   31Dec2017        31Jan2018
A           C            01Jan2018      31Jul2018   01Feb2018        30Dec2018

在这个 table 中有不同状态 "status_1" 和 "status_2" 的开始和结束日期。我想获得有关两个加入状态的变化的信息。所需的 table 将是:

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

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

有人能帮忙吗?

您似乎需要相交的时间段(?),这可以通过查询结果中每个日期的简单 '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