获取 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
我想在 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