SQL Server 日期范围生成到多行

Posted

技术标签:

【中文标题】SQL Server 日期范围生成到多行【英文标题】:SQL Server date range generate to multiple rows 【发布时间】:2020-09-29 07:28:25 【问题描述】:

表名

样本数据

Number Date_From   Date_To   
1      2020-09-29  2020-09-30

我需要返回这样的东西:

Number Date_generated
1      2020-09-29
1      2020-09-30

【问题讨论】:

这有帮助吗? ***.com/questions/18026236/sql-server-columns-to-rows 或者尝试搜索sql server columns to rows 您显示的是旋转,而不是生成范围。你究竟想要什么?如果Date_To2020-10-30 怎么办?您希望 2 行还是 31 行? 【参考方案1】:

您可以使用横向连接进行反透视:

select t.number, x.date_generated
from mytable t
cross apply (values (t.date_from), (t.date_to)) as x(date_generated)

另一方面,如果您想在范围内每天生成一行,一个选项使用递归查询:

with cte as (
    select number, date_from date_generated, date_to from mytable
    union all
    select number, dateadd(day, 1, date_generated), date_to from cte where date_generated < date_to
)
select * from cte

如果您有超过 100 天的范围,则需要在查询的最后添加 option (maxrecursion 0)

【讨论】:

【参考方案2】:

基于已经提出的问题here : 您可以使用此函数将字符串拆分为所需的分隔符。在你的情况下它是'|'

CREATE FUNCTION dbo.SplitStrings
(
    @List       NVARCHAR(MAX),
    @Delimiter  NVARCHAR(255)
)
RETURNS TABLE
AS
    RETURN (SELECT Number = ROW_NUMBER() OVER (ORDER BY Number),
        Item FROM (SELECT Number, Item = LTRIM(RTRIM(SUBSTRING(@List, Number, 
        CHARINDEX(@Delimiter, @List + @Delimiter, Number) - Number)))
    FROM (SELECT ROW_NUMBER() OVER (ORDER BY s1.[object_id])
        FROM sys.all_objects AS s1 CROSS APPLY sys.all_objects) AS n(Number)
    WHERE Number <= CONVERT(INT, LEN(@List))
        AND SUBSTRING(@Delimiter + @List, Number, 1) = @Delimiter
    ) AS y);

像这样使用它:

SELECT s.[message-id], f.Item
  FROM dbo.SourceData AS s
  CROSS APPLY dbo.SplitStrings(s.[recipient-address], '|') as f;

【讨论】:

【参考方案3】:

你可以使用

select number,date_from Date_generated from tbl
union all
select number,date_to Date_generated from tbl

【讨论】:

以上是关于SQL Server 日期范围生成到多行的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:来自多行的最新属性集和日期

SQL Server连续日期 - 将多行汇总为连续的开始和结束日期行,而不包含CTE,循环,... s

基于单个日期从多行创建日期范围

SQL Server 和 Oracle 兼容的多行插入?

如何在 SQL Server CE 数据库中插入多行? [关闭]

SQL Server 转置(可能是转置?)多行到一列