编写一个SQLite查询,该查询返回日期早于特定值的所有记录

时间:2019-01-14 01:38:19

标签: sqlite date-comparison

我有一个包含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;

我希望它返回仙人掌,但它同时返回仙人掌和Dakshin。

我发现了这个线程:SQLite return records where date is more than a week old

但是,当我尝试> =时,它不返回任何值;当我仅尝试使用LastVisit而不是DATE(LastVisit)时,它不返回任何值;当我尝试90天而不是3个月时,则不返回任何值。我不明白我在做什么错。

1 个答案:

答案 0 :(得分:0)

您的插入语句似乎有问题,因为日期文字只是字符串文字,因此应该用单引号引起来:

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格式,这是正确的,除了可能没有用单引号引起来。