如何在SQLITE3中找到共享同一个月和出生日的两条记录

时间:2014-09-10 17:07:03

标签: sqlite

我有一张PERSON表,他们有一个名字和一个生日。

例如,我有一个名为PERSON的表

INSERT INTO PERSON VALUES ( 'alice', '1986-10-10');
INSERT INTO PERSON VALUES ( 'kate', '1992-10-10');

我想输入一个将产生alice和kate的查询(显示所有分享月和日的条目的查询,年份无关紧要)。生日用于存储此日期,我使用了日期数据类型。

我有不同出生日期的其他价值观,所以我似乎无法弄清楚会产生爱丽丝和凯特的查询(因为他们分享他们生日的月份和日期)

这是我到目前为止所做的,但这并没有产生任何结果:

SELECT Name FROM PERSON
WHERE Birthday LIKE '_____XX__XX';

1 个答案:

答案 0 :(得分:0)

您的查询将按原样运行(使用更正的模式),但您需要确保日期的格式正确。来自文档:

A time string can be in any of the following formats:

1.  YYYY-MM-DD 
...

因此您需要在所有日期使用该格式。 “1992-3-3”将不被视为日期;你需要使用“1992-03-03”。或者您可以使用朱利安日期,这使得算术非常方便,但在不使用日期/时间函数的情况下阅读更难一点。

如果您使用正确的ISO日期格式,那么LIKE子句将起作用,或者您可以使用日期/时间函数来提取日期。例如,

SELECT name, strftime('%m-%d',birthday) FROM person;
alice|10-10
kate|10-10

所以如果你想要你可以GROUP BY那个词:

SELECT strftime('%m-%d',birthday) as mday, count(*) FROM person GROUP BY mday;

或者找到所有不同的值,或者您喜欢的任何值。

例如,您可以通过将Person加入自身来获取所有人和所有与他们分享生日的人的列表:

SELECT p1.name, p2.name, strftime('%m-%d', p1.birthday) 
FROM person p1 LEFT OUTER JOIN person p2
  ON (strftime('%m-%d',p1.birthday) = strftime('%m-%d',p2.birthday) AND p1.rowid <> p2.rowid) ;

也就是说,使用提取的月 - 日将表连接到自身,并排除将行连接到自身。使用左外连接包括不与任何人分享生日的人。