SQLite не имеет тип данных DATE? Как я могу обойти это? - PullRequest
3 голосов
/ 12 февраля 2012

SQLite не имеет типа данных для дат.

Мне было интересно, достаточно ли этого для сравнения строк между строками даты, например Y-m-d H:i:s (стандартный формат sql datetime).

Например ...WHERE date < NOW()....это потерпит неудачу в определенных ситуациях?

Ответы [ 5 ]

5 голосов
/ 12 февраля 2012

Вы можете хранить даты в SQLite со следующими типами данных:

  • ТЕКСТ в виде строк ISO8601 ("ГГГГ-ММ-ДД ЧЧ: ММ: СС.ССС").
  • REAL как числа юлианских дней, количество дней, прошедших с полудня в Гринвиче 24 ноября 4714 г. до н.э. в соответствии с Григорианским календарём с пролеплением.
  • INTEGER как Unix Time, количество секунд с 1970-01-01 00:00:00 UTC.

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

Теперь вы также упомянули функцию NOW(), и она не будет работать вSQLite.Это для MySQL.Это покажет вам синтаксис SQLite для использования:

sqlite> select date('now');
2012-02-12
sqlite> select date('now') = date('2012-02-12');
1
sqlite> select date('now') = date('2012-02-11');
0

Итак, настоятельно рекомендуется использовать эти функции и, с другой стороны, убедиться, что вы не используете NOW().

3 голосов
/ 12 февраля 2012

цитируется Роджером

SQLite не имеет выделенных типов даты и времени , но имеет несколько функции даты и времени . Следуйте форматам представления строки (на самом деле только форматы 1-10) понимаются этими функциями (сохраняя значение как строка), а затем вы можете использовать их, а также лексикографическое сравнение в строках будет соответствовать сравнение даты и времени (если вы не попробуйте сравнить даты с временами или datetime с временами, которые не в любом случае имеет смысл)

В зависимости от того, какой язык вы используете, вы можете даже автоматически преобразование . (Что не относится к сравнениям в SQL-выражениях, таких как пример, но облегчит вашу жизнь.)

2 голосов
/ 12 февраля 2012

Использование now() не будет работать, потому что SQLite не знает, что это значит. SQLite, однако, знает, что означает current_timestamp и , который имеет желаемый формат :

Формат для CURRENT_TIMESTAMP - "ГГГГ-ММ-ДД ЧЧ: ММ: СС".

В MySQL current_timestamp - это синоним now(), который также имеет желаемый формат :

Возвращает текущую дату и время в виде значения в 'YYYY-MM-DD HH:MM:SS'.

Таким образом, они оба используют форматы отметок времени ISO-8601 , и практически любая база данных сможет легко преобразовывать строки ISO-8601 в отметки времени и отметки времени, что является хорошим и портативным выбором.

2 голосов
/ 12 февраля 2012

Лично мне нравится использовать неподписанные INT и метки времени unix для дат.Сравнивать даты как целые числа очень просто и эффективно, и в PHP есть множество функций, позволяющих сделать эти даты удобочитаемыми.

http://php.net/manual/en/function.date.php

1 голос
/ 12 февраля 2012

Я почти уверен, что в некоторых ситуациях это не удастся.Более быстрый метод будет хранить значения time () (или mktime ()) и генерировать запросы на основе time ().

Это также будет работать с MySQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...