Sql server T-SQL n行表示两天之间的天数
我有一个我自己无法回答的问题。我正在使用T-SQL和一个基本查询:Sql server T-SQL n行表示两天之间的天数,sql-server,tsql,Sql Server,Tsql,我有一个我自己无法回答的问题。我正在使用T-SQL和一个基本查询: SELECT OpenArt, DayFrom, Dayto FROM Locations WHERE OpenArt = 'closed' AND S_ID = '123' 我想知道每个日期,在那里我的位置是关闭的。到目前为止,这是可行的,因为输出类似于: | OpenArt | DayFrom | DayTo | +---------+------------+------------+ | Close
SELECT OpenArt, DayFrom, Dayto
FROM Locations
WHERE OpenArt = 'closed' AND S_ID = '123'
我想知道每个日期,在那里我的位置是关闭的。到目前为止,这是可行的,因为输出类似于:
| OpenArt | DayFrom | DayTo |
+---------+------------+------------+
| Closed | 06.12.2019 | 09.12.2019 |
| Closed | 23.12.2019 | 31.12.2019 |
基本上,当一个位置关闭时,它显示一个范围。但是,对于API,我需要为每个关闭日发送一行。因此,对于2019年12月23日至2019年12月31日的范围,我需要9行,如下所示:
| OpenArt | DayClosed |
+---------+------------+
| Closed | 23.12.2019 |
| Closed | 24.12.2019 |
| Closed | 25.12.2019 |
等等。标题的命名没有那么重要,我可以调整它。我只是不知道如何“复制”结果,这取决于两天之间的范围。我知道有datediff()
,但我只能想到这些。提前谢谢
没有限制,可以有一个新的temp_表、一个UDF或任何有效的东西 一种选择是使用特别理货表与交叉申请相配合 示例
Set Dateformat DMY
Declare @YourTable Table ([OpenArt] varchar(50),[DayFrom] date,[DayTo] date) Insert Into @YourTable Values
('Closed','06.12.2019','09.12.2019')
,('Closed','23.12.2019','31.12.2019')
Select OpenArt
,DayClosed = D
From @YourTable
Cross Apply (
Select Top (DateDiff(DAY,[DayFrom],[DayTo])+1)
D=DateAdd(DAY,-1+Row_Number() Over (Order By (Select Null)),[DayFrom])
From master..spt_values n1,master..spt_values n2
) B
返回
或另一个日期范围已知的选项
Declare @Date1 date = '2019-01-01'
Declare @Date2 date = '2020-12-31'
Select OpenArt
,DayClosed = D
From @YourTable
Join (
Select Top (DateDiff(DAY,@Date1,@Date2)+1)
D=DateAdd(DAY,-1+Row_Number() Over (Order By (Select Null)),@Date1)
From master..spt_values n1,master..spt_values n2
) B on D between [DayFrom] and [DayTo]
有日历桌吗?如果没有,是时候创建一个;一旦你这样做了,你会发现这很琐碎。问题是——我也不喜欢它——这是很久以前创造的。其他收件人需要这种格式。DateFrom+DateTo存储在smalldatetime()中。您建议创建一个临时日历表吗?在我看来,格式没有问题,但日历表很简单,因为它实际上是一个简单的联接:
在CT.CalendarDate上联接您的CalendarTable CT,在YT.DateFrom和YT.DateTo之间
SQL的替代方案,在C中,您可以使用Enumerable.Range()生成从0到datediff天的范围并生成结果!