2012-02-10 2 views
2

У меня есть набор таблиц, которые передаются в исторические отчеты. Для создания отчета требуется некоторое время, и я хочу создать таблицы кэша, которые будут хранить скомпилированные данные, которые затем будут переданы в отчет.SQL: встроенный способ обнаружения пробелов в произвольной серии дат?

Одним из ключей этих таблиц кэша будет поле даты. Я хочу убедиться, что у меня нет пробелов в любой серии дат, которые я использую - например. Я не хочу иметь записи 1 и 3 января, в то время как 2-й не имеет строки.

Я не могу придумать способ принудительного применения этого с помощью любого из реляционных инструментов в РСУБД. Я мог бы установить таблицу дат, чтобы убедиться, что связанные записи не упадут за пределами серию дат - чтобы запретить 2 января, если у нее не было соответствующей строки в моей таблице «даты», - но Я не вижу, как автоматически обеспечить, чтобы я не пропускал даты в диапазоне.

Есть ли автоматический способ сделать это в определении схемы базы данных? Или мне придется проверять пробелы в моем коде?

Я использую MySQL, но это кажется RDBMS-агностиком.

ответ

2

Я не знаю, как это сделать, но так, как я сам справлялся с этим, нужно создать таблицу дат. У меня есть статическая таблица называется tbDates, и когда мне нужно сообщить о диапазоне дат и не хочу пропустить даты, для которых я мог бы быть недостающими данные, я:

select * 
from 
    tbDates d 
    left join myTable t 
     on d.date = t.date 

В зависимости от того, какого формата и тип данных столбца даты в вашем табуляции, вам может понадобиться немного отформатировать данные, чтобы он мог присоединиться к tbDates. Некоторые из моих приложений не имеют tbDates. В таких случаях тривиально создавать временную таблицу с непрерывными датами для диапазона, который я хочу.

0

Невозможно сделать это автоматически, но вы можете сгенерировать даты и сохранить их во временной таблице.

Это может быть сделано в хранимой процедуре:

  • создание временных табличного
  • значений вставных от даты начала до даты окончания (каждый день)
  • выбрать результаты и присоединиться к временной таблице
  • выберите только строки, которые не соответствуют во временной таблице
1

Это отличный пример полезность таблицы чисел (http://www.projectdmx.com/tsql/tblnumbers.aspx).

Создайте таблицу чисел, я не знаю, десять тысяч строк. Затем вы можете выбрать из этой таблицы и использовать функцию DATEADD.

SELECT DATEADD(d, a.id, '2012-01-01') 
FROM NumbersTable 

С этим запросом на месте, это так просто, как хороший LEFT JOIN к данным, и вы можете увидеть, что даты отсутствуют.

В качестве альтернативы, что-то, что мне нравится делать, а не использовать таблицу чисел, заключается в создании таблицы дат. Фактически, вы можете заполнить таблицу дат только днями (без выходных). Легко!

+0

Такие таблицы даты невероятно полезны для такого рода вещей.Я обычно имею несколько столбцов в таблице для обозначения вещей, например, дни, будни, праздники и т. Д. –

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