我有一个包含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个月时,则不返回任何值。我不明白我在做什么错。
答案 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格式,这是正确的,除了可能没有用单引号引起来。