SQL Server: диапазон дат вступления в выбор - PullRequest
0 голосов
/ 24 сентября 2019

Я выбрал некоторые данные, такие как

Select startDate(01.09.19), endDate(30.09.19) 
from DataTable

И мне нужно преобразовать этот выбор, например, если я получу одну строку с датой начала 01.12.2019 и датой окончания 31.12.2019, я должен сделать 31 строку: каждая строка содержит следующую дату в этом диапазоне дат.

Строка, определенная выше, должна преобразоваться в

StartDate:01.12.2019, EndDate:31.12.2019, Day:01.12.2019;
StartDate:01.12.2019, EndDate:31.12.2019, Day:02.12.2019;
... 
StartDate:01.12.2019, EndDate:31.12.2019, Day:31.12.2019;

Как я могу выполнить это за один выбор?

Ответы [ 3 ]

0 голосов
/ 24 сентября 2019

Еще один вариант, если у вас нет таблицы календаря или таблицы чисел, вы можете использовать специальную таблицу

Пример

Declare @YourTable table (startDate date,endDate date)
Insert Into @YourTable values
('2019-01-01','2019-12-31')


Select A.*
      ,NewValue = DateAdd(DAY,N-1,startDate)
 From  @YourTable A
 Cross Apply (  Select Top (datediff(day,startDate,endDate)+1) N=Row_Number() Over (Order By (Select NULL)) From master..spt_values n1, master..spt_values n2 ) B

Возвращает

startDate   endDate     NewValue
2019-01-01  2019-12-31  2019-01-01
2019-01-01  2019-12-31  2019-01-02
2019-01-01  2019-12-31  2019-01-03
2019-01-01  2019-12-31  2019-01-04
...
2019-01-01  2019-12-31  2019-12-31
0 голосов
/ 24 сентября 2019

Проверить / Попробуйте это-

DECLARE @date DATE='20191201';

;WITH N(N)AS 
(SELECT 1 FROM(VALUES(1),(1),(1),(1),(1),(1))M(N)),
tally(N)AS(SELECT ROW_NUMBER()OVER(ORDER BY N.N)FROM N,N a)
SELECT top(day(EOMONTH(@date)))
  N day,
  dateadd(d,N-1, @date) AS DATES,
  CAST(DATEADD(month, DATEDIFF(month, 0, @date), 0) AS DATE) AS [START_DATE],
  EOMONTH(@date) AS END_DATE
FROM tally
0 голосов
/ 24 сентября 2019

CTE - идеальное решение для ваших вопросов.

DECLARE @StartDate DATE = '20190901' 
DECLARE @EndDate DATE = '20190930'

;
WITH A (StartDate, EnDate, [Date])
AS
(
  SELECT @StartDate, @EndDate, @StartDate
  UNION ALL
  SELECT @StartDate,@EndDate,(DATEADD(dd,1,[Date]))
  FROM A
  WHERE [Date] < @EndDate
)

SELECT *  FROM A ORDER BY [Date]--this should return you 30 records
...