我有一张满是开始日期和结束日期的表格,比如

Start End
2023-05-19 20:00:00.000 2023-05-22 05:30:00.000
2023-05-22 05:30:00.000 2023-05-24 11:30:00.000

我想要一个SELECT查询,它返回所有这些内容,并将其拆分为

Start End
2023-05-19 20:00:00.000 2023-05-19 23:59:59.000
2023-05-20 00:00:00.000 2023-05-20 23:59:59.000
2023-05-21 00:00:00.000 2023-05-21 23:59:59.000
2023-05-22 00:00:00.000 2023-05-22 05:30:00.000

我试过https://stackoverflow.com/a/57142843/22022398次了 但超过1天就不起作用了

Start End
2023-05-19 20:00:00.000 2023-05-19 23:59:59.000
2023-05-22 00:00:00.000 2023-05-22 05:30:00.000

我的SQL服务器是MSSQL15,因此不能使用GENERATE_SERIAL()

我也try 了https://stackoverflow.com/a/25911919/22022398,但我想不出如何为整个表而不是单个日期实现它

推荐答案

像这样的事情就能奏效.我建议使用实际的数字表格,而不是CTE,但这是您可以自己解决的问题.

CREATE TABLE #tmp(StartDT datetime, EndDT datetime)
INSERT INTO #tmp    VALUES
('2023-05-19 20:00:00.000', '2023-05-22 05:30:00.000'),
('2023-05-22 05:30:00.000', '2023-05-24 11:30:00.000')


;WITH NUMS AS
(
SELECT TOP 365
  ROW_NUMBER() OVER(ORDER BY c1.[object_id]) RN
FROM sys.all_columns c1
  CROSS JOIN sys.all_columns  c2
)
SELECT  
    CASE WHEN RN = 1 THEN StartDT  
        ELSE CAST(DATEADD(day, RN-1,CAST(StartDT as date) ) as datetime )
    END NewStart
    ,
    CASE WHEN RN = DATEDIFF(day, t1.StartDT,t1.EndDT)+1 
        THEN EndDT
    ELSE
        DATEADD(second,-1,  CAST(DATEADD(day, RN,CAST(StartDT as date)) as datetime))
    END EndDT

FROM #tmp t1
CROSS APPLY(SELECT RN from NUMS where RN <= DATEDIFF(day, t1.StartDT,t1.EndDT)+1) DayNums
ORDER BY NEWStart

Sql相关问答推荐

SQL—如何在搜索的元素之后和之前获取元素?

如何在Presto中将多个列合并到一个数组中

计算周时出现SQL错误结果

更新其组的日期字段值小于最大日期减go 天数的记录

使用DatePart函数对日期时间值进行分组

如何根据行状态设置正确的标志

来自按PostgreSQL分组的最小日期

数据库SQL PARSE_SYNTAX_ERROR

在SQL中将项分配给容器

如何将insert语句重复n次使一个值递增?

统计重复记录的总数

使用多个数据库调用重载 CQRS 模式

SQL 中的第一个值和倒数第二个值

根据不同日期标准分配组的逻辑

SQL Server - 判断 ids 层次 struct 中的整数 (id)

在where语句中使用CTE非常缓慢

如何优化仅返回符合条件的三条记录的查询?

为什么 Oracle 在一个查询中对同一张表同时执行 TABLE SCAN 和 INDEX UNIQUE SCAN?

sql count distinct by column 和 sum false 和 true

SQL 中的问题与包含最大日期的记录连接