让我们给出一个日期时间2019-04-22 00:00:00.000
(2019年4月22日午夜)
现在我有一个包含StartDate和EndDate的记录表
ID StartDate EndDate
--------------------------------------------------------------------------
1 2019-04-15 00:00:00.000 2019-04-18 00:00:00.000
2 2019-04-16 00:00:00.000 2019-04-28 00:00:00.000
3 2019-04-23 00:00:00.000 2019-04-25 00:00:00.000
如何拆分ID = 2的记录,以便获得两条记录:
2019-04-16 00:00:00.000
和结束日期:2019-04-21 23:59:59.000
2019-04-22 00:00:00.000
和结束日期:2019-04-28 00:00:00.000
基本上,如果范围的开始日期在2019-04-22 00:00:00.000
之前,结束日期在2019-04-22 00:00:00.000
之后,则将该记录分成两个记录,其中第一条记录的结束日期将在2019-04-22 00:00:00.000
之前的午夜并且第二条记录的开始日期将为2019-04-22 00:00:00.000
。
答案 0 :(得分:1)
我要做一个UNION ALL
,其中第一个SELECT
返回在给定日期时间之前开始的所有行,第二个SELECT
返回在该日期时间之后结束的所有行。像这样:
select id, startdate, case when EndDate < '2019-04-22 00:00:00.000' then EndDate
else '2019-04-22 00:00:00.000' end EndDate
from tablename
where startdate < '2019-04-22 00:00:00.000'
UNION ALL
select id, case when startdate > '2019-04-22 00:00:00.000' then startdate
else '2019-04-22 00:00:00.000' end,
EndDate
from tablename
where EndDate > '2019-04-22 00:00:00.000'
case
表达式用于调整重叠行的开始或结束时间,这些行被分成两行。
答案 1 :(得分:0)
您可以使用以下解决方案:
DECLARE @splitDate DATE = '2019-04-22 00:00:00.000';
SELECT ID, StartDate, (select min(i) from (values (test.EndDate), (@splitDate)) AS T(i)) AS EndDate
FROM table_name WHERE StartDate < @splitDate
UNION ALL
SELECT ID, (select max(i) from (values (test.StartDate), (@splitDate)) AS T(i)) AS StartDate, EndDate
FROM table_name WHERE EndDate > @splitDate