Можно ли сравнивать даты, хранящиеся в виде строки / текста? - PullRequest
6 голосов
/ 27 марта 2011

Я работаю в SQLite, поэтому храню даты как текст.

YYYY-MM-DD hh:mm:ss

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

Я продолжаю видеть в сети людей, которые упоминают, как даты в тексте должны быть преобразованы для каких-либо сравнений, но я не понимаю, почему они просто не будут работать так долго, пока они находятся в этом самом большом -> самом маленьком порядке , Очевидно, я не умею заниматься математикой, но Select DateTime From Table where DateTime > 2010-04-21 15:34:55 должно быть абсолютно надежным, верно?

Есть ли какое-то исключение, о котором я не думаю?

Ответы [ 4 ]

5 голосов
/ 30 марта 2011

Это работает просто отлично. SQLite не имеет фактического типа данных DATE (или DATETIME), как многие другие базы данных. Вы можете сохранить дату в строковом формате, который будет правильно сортироваться (ГГГГ-ММ-ДД или ГГГГ-ММ-ДД чч: мм: сс), или преобразовать дату в число и сохранить ее вместо этого.

Если вы используете строковый формат, то вы, конечно, должны включать кавычки:

SELECT DateTime FROM Table WHERE DateTime > '2010-04-21 15:34:55'
3 голосов
/ 30 марта 2011

Причина, по которой вы видите много упоминаний о конверсии при хранении дат в базе данных, заключается в том, что большинство механизмов баз данных имеют «родной» тип данных для даты / времени. SQLite не делает. Он предлагает хранить даты в виде строковых значений или значений с плавающей точкой в ​​юлианских датах.

Кроме того, некоторые другие базы данных имеют довольно неясные функции даты-строки (я смотрю на вас, SQL Server ), где трудно понять, как получить сортируемую строку даты. Стандартный формат даты в SQLite (ГГГГ-ММ-ДД ЧЧ: НН: СС) отлично сортируется и легко читается.

Вы будете хорошо работать с текстовыми датами при сравнении или сопоставлении - если вы используете правильный формат, как вы представляете.

На самом деле, вы даже можете выполнять математику, используя функции даты и времени SQLite ; они довольно неортодоксальны, но удивительно гибки.

1 голос
/ 30 марта 2011

Если все, что вы делаете, это сортировка и поиск, у вас все будет хорошо. Люди годами используют этот формат с именами файлов именно для этой цели. Он должен начинать разрушаться только в том случае, если вам нужно выполнить какие-либо операции, связанные с расчетами (например, найти все записи в течение тридцати дней после определенной даты).

1 голос
/ 30 марта 2011

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

Сравнение дат в тексте похоже на бег с ножницами. Но SQLite заставляет вас все время бегать с ножницами.

sqlite> create table test (d1 datetime primary key);
sqlite> insert into test values ('2011-31-31 08:63:00');
sqlite> select * from test;
2011-31-31 08:63:00

При переводе или обновлении значений, например «2011-31-31 08:63:00», дБмс, соответствующий стандартам SQL, вызовет ошибку «вне диапазона». Но SQLite позволяет вам вставлять что угодно. Вы даже можете вставить «Catcall» в столбец datetime. (Попробуйте.)

SQLite дает вам то же поведение "бег с ножницами", если вы используете текст.

sqlite> create table test (d1 varchar(25) primary key);
sqlite> insert into test values ('2011-31-31 08:63:00');
sqlite> select * from test;
2011-31-31 08:63:00

Если значения не соответствуют ожидаемым, вы, вероятно, увидите следующий тип поведения.

sqlite> create table test (d1 varchar(25), d2 varchar(25));
sqlite> insert into test values ('2011-01-01 08:00:00', '2011-01-01 08:15:00');
sqlite> select d1<d2 from test;
1
sqlite> update test set d2 = '2011+01-01 08:15:00';
sqlite> select d1<d2 from test;
0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...