2015-06-29 3 views
0

У меня есть таблица информации о размере базы данных. Данные собираются ежедневно. Однако некоторые дни пропущены по разным причинам. Кроме того, у нас есть базы данных, которые приходят и уходят, или размер не записывается для нескольких баз данных в течение дня или двух. Все это приводит к очень противоречивому сбору данных о датах. Я хочу построить SQL-процедуру, которая будет генерировать процент изменений между любыми двумя датами (1 неделя, месяц, квартал и т. Д.) Для ВСЕХ баз данных. Проблема заключается в том, что делать, если отсутствует выбранная дата (для этой даты нет строк или нет строки для одной или нескольких баз данных для этой даты). То, что я хочу сделать, - это получить ближайшую доступную дату для каждой базы данных для двух дат (начало и конец).SQL Server Хранимая процедура получить ближайшую доступную дату к параметру

Например, если база данных MyDB имеет следующие записи даты:

2015-05-03 
2015-05-04 
2015-05-05 
2015-05-08 
2015-05-09 
2015-05-10 
2015-05-11 
2015-05-12 
2015-05-14 

и я хочу, чтобы сравнить с 2015-05-06 2015-05-14

2015-05-07 дата отсутствует, поэтому я хотел бы использовать следующую доступную дату, которая является 2015-05-08. Имейте в виду, что MyOtherDB может отсутствовать только с датой 2015-05-06, но иметь дату 2015-05-07. Итак, для MyOtherDb я бы использовал 2015-05-07 для сравнения.

Есть ли способ обработать это с помощью SQL без использования CURSOR?

ответ

1

Вы слишком много думаете об этом, просто выполняйте функцию «МЕЖДУ» в предложении where, которое принимает два параметра.

В вашем примере, если выполнить запрос:

SELECT * FROM DATABASE_AUDIT WHERE DATE BETWEEN param1 /*2015-05-06*/ and param2 /*2015-05-14*/ 

Это даст вам желаемые результаты.

select (b.dbsize - a.dbsize)/a.dbsize *100 dbSizecChangePercent from 
(select top 1 * from dbAudit where auditDate = (select min(auditDate) from dbAudit where auditDate between '01/01/2015' and '01/07/2015')) a 
cross join 
(select top 1 * from dbAudit where auditDate = (select max(auditDate) from dbAudit where auditDate between '01/01/2015' and '01/07/2015')) b 

Верх 1 может быть заменен группой. Предполагаемое время суток: 1 db aduit в день

+0

Возможно. Что, если ближайшая конечная точка к началу до начала интервала? –

+0

Я не хочу возвращать все строки между ними. Я хочу только конечные точки, чтобы вычислить разницу в размерах и вернуть процент изменения. – Woody

+0

Gotcha, ответ обновлен –

Смежные вопросы