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_To
是2020-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连续日期 - 将多行汇总为连续的开始和结束日期行,而不包含CTE,循环,... s