将特定日期的日期时间范围分成2条记录

时间:2019-10-03 07:02:27

标签: sql sql-server

让我们给出一个日期时间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

2 个答案:

答案 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

demo on dbfiddle.uk

相关问题