2015-05-16 4 views
3

В настоящее время у меня есть таблица с датой создания и датой истечения срока действия. В настоящее время у меня есть команда sql для получения количества действительных элементов для заданной даты.Отображение числа допустимых результатов для диапазона дат

select 
    count(id) ,CONVERT(date, getdate()) 
from 
    table 
where 
    createDate < getdate() and expDate > getdate() 

Это возвращает количество и текущую дату.

Возможно ли написать запрос sql, который вернет результат для ряда дат, скажем, если я захочу построить число допустимых элементов в течение 15 дней?

Спасибо!

ответ

2

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

create table #datelist (ValidDateCheck date, ValidResults int) 

declare @startdate date = '1/1/2015' 
declare @enddate date = '2/1/2015' 
declare @interval int = 1 --Use 1 if you want every day between your dates, use 2 if you want every other day, etc. 

declare @datecounter date = @startdate 
declare @count int 

while @datecounter <= @enddate 
begin 
set @count = 
    (select count(*) 
    from Table 
    where CrtDt <= @datecounter and ExpDt > @datecounter) 
insert into #datelist values (@datecounter, @count) 
set @datecounter = dateadd(dd, @interval, @datecounter) 
end 

select * from #datelist order by 1 

Он перебирает все даты в вашем диапазоне, считая достоверные результаты для каждого из них.

2

Проверить это,

DECLARE @StartDate DATETIME, 
     @EndDate DATETIME; 

SELECT @StartDate = '20110501'   
     ,@EndDate = '20110801'; 

SELECT 
     DATEADD(d, x.number, @StartDate) AS MonthName1 
     , 
     x.number 
FROM master.dbo.spt_values x 
WHERE x.type = 'P'   
AND  x.number <= DATEDIFF(MONTH, @StartDate, @EndDate); 

Этот запрос дает список дат между 2 датами.

В соответствии с вашим столом и вопросом, проверьте это также.

declare @table table(id int,frdt datetime, todt datetime) 

insert into @table values (1,GETDATE()-20, GETDATE()-19) 
,(2,GETDATE()-9, GETDATE()-8) 
,(3,GETDATE()+20, GETDATE()+18) 
,(4,GETDATE(), GETDATE()-1) 
,(5,GETDATE()-20, GETDATE()) 
,(6,GETDATE()-10, GETDATE()+10) 

select * from @table 

declare @frdt datetime = null , @todt datetime = getdate()-10 

select @frdt, @todt,* from @table 
where 
(@frdt is null or @frdt between frdt and todt) 
and 
(@todt is null or @todt between frdt and todt) 

select @frdt = GETDATE()-15 , @todt = GETDATE() 

select @frdt, @todt,* from @table 
where 
(@frdt is null or @frdt between frdt and todt) 
and 
(@todt is null or @todt between frdt and todt) 
Смежные вопросы