Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server T-SQL n行表示两天之间的天数_Sql Server_Tsql - Fatal编程技术网

Sql server T-SQL n行表示两天之间的天数

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

我有一个我自己无法回答的问题。我正在使用T-SQL和一个基本查询:

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天的范围并生成结果!