2011-12-20 4 views
3

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

В SQLite Documentation, дата и время Datatype определяется следующим образом:

1,2 Дата и время Datatype

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

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

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

Таким образом, экономя свое DateTime значение либо как REAL (флоат) или INTEGER имеет тот же размер.

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

Как насчет формата 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; 
} 

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

+0

пожалуйста не хранить даты в виде текста. –

+0

FYI: формат даты «REAL» от 24 ноября 4714 г. до н.э. выдает «аргумент ArgumentOutOfRangeException»: * «Указанный аргумент вышел за пределы допустимых значений». * – jp2code

+0

и вам нужно было представить 4714 BC? –

ответ

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

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

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

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

Я бы определил базовую дату 24 ноября 4714 г. B.C.? (Я даже не уверен, что если 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
+0

Знаете, после того, как это произошло через несколько дней, я уже пришел к выводу, что собираюсь хранить дату в виде строки. Полагаю, вы сказали это, и я только подумал, так что вы получите ответ. +1 для размышления о форматировании даты так же. В настоящее время я принимаю значения по умолчанию, и я вижу, что это может вызвать проблемы. – jp2code