SQLite Дата и время Тип данных - PullRequest
4 голосов
/ 20 декабря 2011

Я пытаюсь создать красивую небольшую базу данных для запуска в мобильном приложении (Windows Mobile 5, если вам интересно).

В документации SQLite , Дата иТип данных времени определяется следующим образом:

1.2 Тип данных даты и времени

SQLite не имеет выделенного класса хранения для хранения дат и / или времени.Вместо этого встроенные функции даты и времени в SQLite способны сохранять даты и время в виде значений TEXT, REAL или INTEGER:

  • TEXT в виде строк ISO8601 ("YYYY-MM-DD HH:MM: SS.SSS ").
  • REAL в виде чисел в юлианских днях, количество дней с полудня в Гринвиче 24 ноября 4714 г. до н.э. в соответствии с грипорианским календарём с пролеплением.
  • INTEGER в UnixВремя, количество секунд с 1970-01-01 00:00:00 UTC.

Приложения могут сохранять даты и время в любом из этих форматов и свободно конвертировать между форматами, используя встроенныев функциях даты и времени.

Итак, сохранение моего значения DateTime в виде REAL (с плавающей запятой) или INTEGER того же размера.

Как насчетTEXT формат?Выше 23 символа в тексте YYYY-MM-DD HH:MM:SS.SSS. Это 8 байтов на символ? Если так, то это ОГРОМНАЯ трата места для хранения в текстовом формате (что я сейчас и делаю).

А как насчет формата REAL?Буду ли я определять базовую дату от 24 ноября 4714 года до нашей эры?(Я даже не уверен, что Visual Studio 2008 позволит мне сделать это. Я никогда не пробовал.) Затем получите TimeSpan между базовой датой и желаемой датой, извлекитеколичество дней, и сохранить это?

// is this how to declare this date?
private static readonly DateTime nov24_4714bc = new DateTime(-4714, 11, 24);

public static double GetRealDate(DateTime dateTime) {
  // FYI: subtracting dates in .NET returns a time span object
  return (dateTime - nov24_4714bc).TotalDays;
}

А как насчет формата INTEGER?Если бы я определил базовую дату из 1970-01-01 00:00:00 UTC (пожалуйста, скажите мне, как это сделать!), Затем получил бы TimeSpan между базовой датой и моей входной датой, извлеките числосекунд, и сохранить это?

// is this a UTC date?
private static readonly DateTime utc1970_01_01 = new DateTime(1970, 1, 1);

public static double GetIntDate(DateTime dateTime) {
  // FYI: subtracting dates in .NET returns a time span object
  return (dateTime - nov24_4714bc).TotalSeconds;
}

Любая помощь с этим?Я немного запутался в нескольких моментах.

1 Ответ

2 голосов
/ 22 декабря 2011
  • Используйте формат TEXT, если важна «удобочитаемость».
  • Используйте один из числовых форматов, если важно экономить место.

Если вывам не нужна точность в миллисекундах, вы можете сэкономить место в формате TEXT, включив только ту часть, которая вам нужна.Функции даты и времени SQLite допускают три более коротких формата:

  • YYYY-MM-DD HH:MM:SS (19 символов)
  • YYYY-MM-DD HH:MM (16 символов)
  • YYYY-MM-DD (10 символов)

( НИКОГДА не использовать MM/DD/YYYY; оно не поддерживается и сортируется неправильно.)

БудетОпределить базовую дату 24 ноября 4714 г. до н.э.(Я даже не уверен, что Visual Studio 2008 позволит мне это сделать. Я никогда не пробовал.)

Вы не можете: System.DateTime поддерживает только годы с 1 по 9999. Вам нужночтобы выбрать другую базовую дату, а затем выполните (dateTime - baseDate).TotalDays + baseDateJD, где baseDateJD - это юлианская дата базовой даты.Вот некоторые разумные варианты:

  • 0001-01-01 = JD 1721425,5
  • 1970-01-01 = JD 2440587.5
  • 2000-01-01 = JD 2451544,5
...