Хранение даты как целого (числовое), каковы преимущества

Вопрос 1

Я работаю с системой, где дата хранится как целое (фактическое числовое число (8,0)), и я заметил, что другие системы также хранят дату как int, например cisco в этой теме . Пример

20120101  -- 01 Jan 2012

Есть ли какое-либо преимущество сохранения числовой системы дат и не использования SQL Datetime?

Вопрос 2

Теперь я пытаюсь прокрутить числовую дату, чтобы найти клиентов между двумя датами. Если start и enddate охватывают два месяца , Я получаю тысячи записей вместо 60. Пример:

create table #temp1(day int,capacity int) /* just a temp table */

declare @start int 
declare @end int

set @start=20111201
set @end = 20120131

while (@start <= @end) 
Begin
    insert into #temp1  /* I am storing things in #temp table so data looks pretty */
    exec usp_GetDailyCap @date1= @start

    set @start = @start + 1;    
end

select * from #temp1

Это заставляет 8931 записей вместо 60. Есть ли лучший способ улучшить логику выше, поэтому я вытаскиваю только действительные даты? Я пробовал IsDate и подзапросы, но это не очень эффективно работало.

10 голосов | спросил Jackofall 27 MarpmTue, 27 Mar 2012 17:35:17 +04002012-03-27T17:35:17+04:0005 2012, 17:35:17

3 ответа


11

Чтобы ответить на ваш первый вопрос, я бы рекомендовал использовать тип данных DATETIME в SQL Server. Не обязательно по соображениям производительности, но для использования функций, специфичных для РСУБД. Например, вам нужно было бы повторно изобрести много логики, чтобы сделать базовую математику (подумайте DATEDIFF(), DATEADD(), DATEPART() и многие другие функции. DATETIME и с ними легко работать).

Что касается вашего второго вопроса, , вы сталкиваетесь с точной проблемой, что первый вопрос (и мой ответ) ориентирован на . Вы смотрите на 20111201 и 20120131 как даты, и ваш мозг говорит вам, что это должно быть разницей в 60 дней. Ну, вы зацикливаетесь от дельта ... что есть:

20120131 - 20111201 = 8930 (с инклюзивным циклом это будет 8931)

Другими словами, цикл WHILE выполняется 8931 раз. Это происходит потому, что это целые значения, и ваш цикл не будет перескакивать с 20111231 до 20120101.

Целые числа не будут учитывать колпак лет и месяцев (т. е. проблема вопроса 2 ).

ответил Thomas Stringer 27 MarpmTue, 27 Mar 2012 17:46:52 +04002012-03-27T17:46:52+04:0005 2012, 17:46:52
6
  1. Ральф Кимбалл рекомендует хранить даты как целые числа. Он написал много, как онлайн-статей, так и книг.
  2. Вы можете использовать таблицу календаря и выдавать последовательные номера на свои даты следующим образом:

    Номер даты

    20120229 1234

    20120301 1235

Календарная таблица должна быть сгенерирована, но это очень простая задача.

ответил A-K 27 MarpmTue, 27 Mar 2012 18:37:53 +04002012-03-27T18:37:53+04:0006 2012, 18:37:53
5

Потенциальные типы данных и их размеры /ограничения:

  • Десятичный (8,0): 5 байт
  • Дата: 3 байта, 0001-01-01 - 9999-12-31
  • Int: 4 байта

Плюсы для числового типа данных:

  • Они выглядят красиво?

Концы для числового типа данных:

  • Требуется специальный код для обработки операций с датой.
  • Требуется настраиваемый код для управления правильными датами (т. е. не допуская 20120230 [30 февраля 2012 года])
  • Увеличенный размер данных по сравнению с типом данных Date.

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

ответил DForck42 27 MarpmTue, 27 Mar 2012 19:33:52 +04002012-03-27T19:33:52+04:0007 2012, 19:33:52

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132