sql - 为 SQL 中两个日期之间的每个日期添加行

标签 sql date ssms

我有一个包含开始日期和结束日期值的表格。如果开始日期和结束日期不同,我想复制中间日期的行,以便每个日期都有自己的行,其中包含相同的信息。 当然,我已经阅读了很多解决方案,但仍然不知道如何处理我的问题。我不想制作日历表来帮助解决这个问题。因此,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。

<表类=“s-表”> <标题> 学校ID 开始日期 一些位 BigID <正文> 1 20150101 0 437457324555 1 20150102 0 437457324555 1 20150103 0 437457324555 1 20150104 0 437457324555 2 20150101 1 4573467234 2 20150102 0 45756654565 4 20150102 1 4564576754 4 20150103 1 4564576754 5 20150105 1 54745753 5 20150106 1 54745753

在真实的表中,我正在处理 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/

相关文章:

mysql - sql 选择不同的地方最大日期

sql - super 慢查询...我做错了什么?

sql - 有没有办法让 Sql Server FullText 引擎停止将数字识别为数字?

java - 独立 java 与 tomcat 服务器的日期差异

sql - cte 的对象名称无效

SQL Server 使用旧版本代码调试存储过程

php - 另一个有 mysqli 问题的初学者

javascript - 第二天不能使用 setDate

VBA本地时区调整

sql - 如何在 SSMS 中显示批量中单个查询的实际查询计划?