我有一个包含开始日期和结束日期值的表格。如果开始日期和结束日期不同,我想复制中间日期的行,以便每个日期都有自己的行,其中包含相同的信息。 当然,我已经阅读了很多解决方案,但仍然不知道如何处理我的问题。我不想制作日历表来帮助解决这个问题。因此,Create a row for each date in a range, and add 1 for each day within a date range for a record in SQL 并不能解决我的问题。
这是一个最小的可重现示例:
CREATE TABLE
myTable (
[SchoolId] int,
[StartDate] date,
[EndDate] date,
[SomeBit] bit,
[BigId] bigint,
);
INSERT INTO
myTable (
[SchoolId],
[StartDate],
[EndDate],
[SomeBit],
[BigId]
)
VALUES
(1, '20150101', '20150104', 0, 437457324555),
(2, '20150101', '20150101', 1, 4573467234),
(3, '20150102', '20150102', 0, 45756654565),
(4, '20150102', '20150103', 1, 4564576754),
(5, '20150105', '20150106', 1, 54745753)
;
SELECT * FROM myTable;
在此示例中,我想要一个包含四行的结果,其中 schoolId 1、Somebit 0 和 BigId 437...(因此复制除开始日期和结束日期之外的数据),开始日期为 2015-01-01, 2015年1月2日、2015年1月3日和2015年1月4日。将不会使用结束日期的值。
第 2 行和第 3 行的开始日期和结束日期相同,无需添加任何内容。 对于第 4 行和第 5 行,每行应分别添加开始日期 2015-01-03 和 2015-01-05。
在真实的表中,我正在处理 100.000 行。我在 SSMS 中使用 T-SQL。
最佳答案
ISO SQL 的解决方案是:
SELECT *, DATEADD(day, value, [StartDate])
FROM myTable AS T
CROSS APPLY GENERATE_SERIES(0, DATEDIFF(DAY, [StartDate], [EndDate]))
GENERATE_SERIES 已添加到 SQL ISO 标准中,可以在 PostGreSQL 和 MS SQL Server 中找到。
此示例适用于 MS SQL Server。
关于sql - 为 SQL 中两个日期之间的每个日期添加行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77666921/