2015-01-13 2 views
-3

Мне нужен запрос sql, который дает результат между всей датой, передавая две даты. Например, предположим, что я послал 01/01/2015 и 10/01/2015SQL-сервер находит дату между двумя выбранными датами

мне нужна дата между датами прошло

Результат должен быть:

01/01/2015  
02/01/2015  
03/01/2015  
04/01/2015  
05/01/2015  
..   
10/01/2015 

Как я могу добиться этого?

+0

Добро пожаловать в StackOverflow! Я могу дать вам номер банковского счета и ставку. Серьезно: Пожалуйста, продемонстрируйте некоторые усилия и поделитесь нами тем, что вы пробовали до сих пор. StackOverflow не является сервисом gerenation для кода. – Pred

+1

Почему бы не создать [таблицу календаря] (http://www.made2mentor.com/2011/06/creating-a-date-tabledimension-for-sql-server-2008/) и выбрать из этого? – Tony

ответ

1

Вы можете использовать recursive CTE для этого:

DECLARE @startDate DATETIME = '2015-01-01', 
    @endDate DATETIME = '2015-01-10' 

;WITH dates AS(
SELECT @startDate AS date 
UNION ALL 
SELECT DATEADD(dd,1,date) 
FROM dates 
WHERE date<@endDate 
) 
SELECT * FROM dates 
+0

Это будет плохой производительностью. Проверьте это http://sqlperformance.com/2013/01/t-sql-queries/generate-a-set-2 –

+0

Я не думаю, что производительность генерации 10 дат в CTE действительно будет беспокоить любого. Сравнение производительности генерации 50 000 записей с 10 - это сравнение яблок и апельсинов. – Jamiec

+0

@Jamiec - В режиме реального времени это может быть не просто 10. Во всяком случае просто предложение –

0

Используйте Numbers table для создания даты.

DECLARE @StartDate DATETIME = convert(date,'01/01/2015',103) -- First Calendar date to include in table 
DECLARE @EndDate DATETIME = convert(date,'10/01/2015',103) --Last calendar date to include in the table 


;WITH E00(N) AS (SELECT 1 UNION ALL SELECT 1), 
     E02(N) AS (SELECT 1 FROM E00 a, E00 b), 
     E04(N) AS (SELECT 1 FROM E02 a, E02 b), 
     E08(N) AS (SELECT 1 FROM E04 a, E04 b), 
     E16(N) AS (SELECT 1 FROM E08 a, E08 b), 
     E32(N) AS (SELECT 1 FROM E16 a, E16 b), 
    cteTally(N) 
    AS (SELECT Row_number()OVER (ORDER BY N) 
     FROM E32), 
    CalendarBase 
    AS (SELECT CalendarDate = Dateadd(day, n - 1, @StartDate) 
     FROM cteTally 
     WHERE N <= Datediff(day, @StartDate, @EndDate + 1)) 
SELECT convert(varchar(30),CalendarDate ,103) as CalendarDate 
FROM CalendarBase 

Приглашение от этого link

+1

Возможно, вы захотите использовать формат ISO для ваших дат. – Jamiec

+0

@Jamiec - да, лучше конвертировать, потому что OP дает ввод в этом формате –

0

Попробуйте это:

declare @strt date; 
declare @end date; 

select @strt = '20150101'; 
select @end = '20150110'; 

with dates as 
(
select dt = dateadd(dd, 0, @strt) 
where dateadd(dd, 1, @strt) <= @end 
union all 
select dateadd(dd, 1, dt) 
from dates 
where dateadd(dd, 1, dt) <= @end 
) 
select * from dates 
0

@Saurabh Dhakate

Use the below code: 

declare @date1 date ='2015-01-10' 
declare @date2 date ='2015-01-01' 
declare @lv_table table (datepart1 date) 
declare @count int 
declare @count1 int = 1 
set @count=(select day(@date1)) 
print @count 
while @count1<[email protected] 
begin 
insert into @lv_table 
select dateadd(day,@count1,@date2) 
set @[email protected]+1 
print @count1 
end 
select * from @lv_table 
Смежные вопросы