SQL: встроенный способ обнаружения пробелов в произвольной серии дат? - PullRequest
2 голосов
/ 10 февраля 2012

У меня есть набор таблиц, которые подаются в исторические отчеты.Создание отчета сейчас занимает много времени, и я хочу создать кеш-таблицы, в которых будут храниться скомпилированные данные, которые затем будут переданы в отчет.

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

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

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

Я использую MySQL, но это, похоже, не зависит от RDBMS.

Ответы [ 3 ]

2 голосов
/ 10 февраля 2012

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

1 голос
/ 10 февраля 2012

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

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

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

С этим запросом все просто, как ЛЕВОЕ ПОДКЛЮЧЕНИЕ к вашим данным, и вы можете увидеть, какие даты отсутствуют.

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

0 голосов
/ 10 февраля 2012

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

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

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