2011-03-26 3 views
6

Я работаю в SQLite, поэтому храню даты как только текст.Можно ли напрямую сравнивать даты, сохраненные в виде строки/текста?

YYYY-MM-DD hh:mm:ss

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

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

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

ответ

3

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

Кроме того, некоторые другие базы данных имеют довольно неясные функции «от даты до строки» (я смотрю на вас, SQL Server), где трудно понять, как получить отсортированную строку даты. Формат даты по умолчанию SQLite (YYYY-MM-DD HH: NN: SS) отлично сортируется и легко читается.

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

Фактически, вы можете даже выполнять математику, используя SQLite date and time functions; они довольно неортодоксальные, но удивительно гибкие.

+0

хорошо здорово! Я не мог понять, почему это не сработает ... – Damon

5

Это работает отлично. SQLite не имеет фактического типа данных DATE (или DATETIME), как это делают многие другие базы данных. Ваши параметры состоят в том, чтобы сохранить дату в строчном формате, который будет сортироваться правильно (YYYY-MM-DD или YYYY-MM-DD hh: mm: ss) или конвертировать дату в число и сохранить это вместо.

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

SELECT DateTime FROM Table WHERE DateTime > '2010-04-21 15:34:55' 
+1

Супер, этот трюк, вставляющий строку в одиночную цитату, спас мой день. Искали решение .. спасибо – Saqib

1

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

Сравнивая даты как текст, как работает с ножницами. Но 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 

СУБД, которая соответствует стандартам SQL будет поднимать «вне диапазона» ошибка при попытке вставить или обновить значения, как «2011-31-31 08:63:00». Но 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 
+0

Чтобы быть справедливым, «Catcall» никогда не вставляется в столбец 'datetime' в SQLite; скорее, столбец будет столбцом «Текст». И пока мы работаем с ножницами, вы можете вставить столько текста, сколько хотите в столбце varchar (25), поскольку SQLite не будет придерживаться определенного ограничения на 25 символов. –

1

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

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