2016-01-06 2 views
1

Мне нужно выполнить некоторую работу, где я взаимодействую и создаю таблицы, которые управляются библиотекой SQLite.net. Мне нужно иметь возможность создавать таблицы, которые другая программа не будет знать, что она сама не создала.Что такое столбец типа datetime в SQLite?

Рассматривая некоторые схемы и чувствуя, как это создает вещи, я заметил что-то странное. Когда я прочитал около SQLite's data types, я вижу, что это небольшой список, и изначально он выглядел мне как если бы я хотел сохранить дату/время, мне нужно убедиться, что я использую специальные функции в запросах SELECT/INSERT/UPDATE, а столбец может быть TEXT или INTEGER или REAL. Если я где-то забуду функцию datetime(), я ожидаю получить что-то обратно, что не то, что я хотел (за исключением, может быть, столбца TEXT.)

Итак, я смотрю схему для одной из таблиц, и я вижу это в колонках:

"LastUpdated" datetime , 

Uhh, OK. 'datetime' не является типом. Или это? Правила 'type affinity' указывают, что 'datetime' является допустимым спецификатором типа и будет рассматриваться как NUMERIC. Хорошо, ничего действительно нет. Я попробовал запрос:

sqlite> select datetime(LastUpdated) from Foo; 
2016-01-06 15:37:36 

Это имеет смысл. Бьюсь об заклад, если я забуду функцию datetime(), я получу что-то глупое, верно?

sqlite> select datetime(LastUpdated) from DestinationAdapter; 
2016-01-06 15:37:36 

Uhhh ... ОК. Это имело бы смысл, если бы это был столбец ТЕКСТ, я думаю. Поэтому я составил тестовый стол:

sqlite> CREATE TABLE TestDateTime ( 
    ...> "Id" integer primary key autoincrement not null, 
    ...> "Value" TEXT, 
    ...> "ValueN" NUMERIC); 
sqlite> INSERT INTO TestDateTime(Value, ValueN) VALUES (datetime('2015-01-06 10:20:30'), datetime('2015-01-06 10:20:30')); 
sqlite> select * from TestDateTime; 
1|2015-01-06 10:20:30|2015-01-06 10:20:30 

ОК. Это странно. Кажется, что SQLite хранит то, что не является значением, обсуждаемым в документе типа данных. Что бы это ни было, он сообщает консольному инструменту SQLite, что значение в столбце является значением даты/времени и должно быть представлено как таковое. Так что же происходит? Кажется, что независимо от того, какой тип я назначаю столбцу, даты и время «просто работа». Это слишком магия, чтобы мне было удобно. Что на самом деле происходит здесь, и как это повлияет на то, как я пишу свои запросы, содержащие значения даты/времени?

ответ

3

Поскольку вы пытаетесь сохранить текст в поле NUMERIC, он просто сохраняет его как текст. Он не хранит значение даты и времени и не знаю, что хранение Задан, это просто хранить строку, возвращаемую datetime() функции

Из документации вы связаны: (курсив мой)

2,0 Тип Affinity

Для обеспечения максимальной совместимости между SQLite и другими базами данных , SQLite поддерживает концепцию «сродство типа» к столбцам. Тип сродства столбца является рекомендуемым типом для данных, хранящихся в этой колонке . Важной идеей здесь является то, что тип рекомендуется, не требуется. Любая колонка может хранить любые данные . Просто некоторые столбцы, учитывая выбор, предпочтут использовать один класс хранения над другим. Предпочтительный класс хранения для столбца называется его «сродством».

.

Столбец с NUMERIC-аффинностью может содержать значения, используя все пять классов хранения. Когда текстовые данные вставляются в столбцы NUMERIC, класс хранения текста преобразуется в INTEGER или REAL (в порядке предпочтения ), если такое преобразование без потерь и обратимо. Для конверсий между классами TEXT и REAL SQLite считает, что преобразование должно быть без потерь и обратимым, если сохраняются первые десятичные цифры номера. Если преобразование без потерь ТЕКСТА в INTEGER или REAL невозможно, то значение сохраняется с использованием класса хранения TEXT. Попытка сделать для преобразования значений NULL или BLOB.

+0

ОК, это имеет смысл, кроме того, что это заставляет меня задавать вопрос: «Так что же такое функция datetime(), не могу ли я просто пощекотать строку в столбце, чтобы начать?» – OwenP

+0

Ох. Подождите. Является ли ответ на что-то вроде: «Вы не используете datetime() в запросе INSERT»? – OwenP

+1

@OwenP 'datetime()' является функцией форматирования, а не функцией преобразования. поэтому вы будете использовать его, когда хотите преобразовать любое значение, которое вы передаете, в конкретное строковое представление даты и времени. –

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