Напишите запрос SQLite, который возвращает все записи с датами старше определенного значения. - PullRequest
0 голосов
/ 14 января 2019

У меня есть таблица с 5 столбцами, одним из которых является LastVisit (дата последнего посещения ресторана). Я хочу написать запрос, который вернет все рестораны, которые понравились, но не посещались более трех месяцев, но я делаю какую-то ошибку с функциями даты (я думаю).

Если я создаю базу данных и вставляю эти значения:

CREATE TABLE MyRestaurants(Name VARCHAR, Cuisine VARCHAR, Distance INTEGER, LastVisit VARCHAR, Enjoy INTEGER);

INSERT INTO MyRestaurants (Name, Cuisine, Distance, LastVisit, Enjoy) 
VALUES ('Dakshin', 'Indian', 5, 2019-01-13, 1);

INSERT INTO MyRestaurants (Name, Cuisine, Distance, LastVisit, Enjoy) 
VALUES ('Cactus', 'Mexican', 6, 2018-01-4, 1);

Тогда я делаю этот запрос:

SELECT Name 
FROM MyRestaurants 
WHERE Enjoy = 1 AND DATE(LastVisit) <= DATE('now', '-3 month') 
ORDER BY Name;

Я ожидаю, что он вернет Кактус, но он вернет и Кактуса, и Дакшина.

Я нашел эту ветку: SQLite возвращают записи, где дата более недели

Но когда я пытаюсь> =, он не возвращает значений, когда я пытаюсь просто LastVisit вместо DATE (LastVisit), он не возвращает значений, а когда я пытаюсь использовать 90 дней вместо 3 месяцев, он не возвращает значений. Я не понимаю, что я делаю не так.

1 Ответ

0 голосов
/ 14 января 2019

Кажется, что в ваших операторах вставки есть проблема, потому что литералы даты - это просто строковые литералы, поэтому их следует заключать в одинарные кавычки:

INSERT INTO MyRestaurants (Name, Cuisine, Distance, LastVisit, Enjoy)
VALUES ('Dakshin', 'Indian', 5, '2019-01-13', 1);

INSERT INTO MyRestaurants (Name, Cuisine, Distance, LastVisit, Enjoy)
VALUES ('Cactus', 'Mexican', 6, '2018-01-04', 1);

Тогда, если вы хотите, чтобы записи, которых не было за последние 3 месяца, вы должны использовать:

SELECT Name
FROM MyRestaurants
WHERE Enjoy = 1 AND LastVisit <= DATE('now', '-3 month')
ORDER BY Name;

Обратите внимание, что в SQLite нет формального типа даты. Скорее, даты просто хранятся как TEXT. Вы правильно использовали формат ISO для своих литералов даты, которые были правильными, за исключением того, что, возможно, вы не избежали их в одинарных кавычках.

...