2014-09-10 2 views
0

У меня есть таблица для ЧЕЛОВЕКА, и в этом они имеют имя и день рождения.Как найти две записи, разделяющие один и тот же месяц и день рождения в SQLITE3

К примеру, у меня есть таблица PERSON

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

Я хотел бы ввести запрос, который будет производить Алису и Катю (запрос, который отображает все записи, которые разделяют месяц и день, год Безразлично Не важно. День рождения используется для хранения этой даты, и я использовал тип данных Date.

У меня есть другие значения с различными датами рождения, так что я не могу показаться, чтобы выяснить, запрос, который будет производить алиса и кейт (потому что они разделяют месяц и день своего рождения)

Это то, что у меня есть до сих пор, но это ничего не производит:

SELECT Name FROM PERSON 
WHERE Birthday LIKE '_____XX__XX'; 
+1

У вас есть правильный запрос, но ваш шаблон имеет дополнительный символ '_' между месяцем и днем. 'LIKE '____-10-10'' работает для меня. –

+0

Да, это работает для значений, которые я перечислял здесь, но у меня есть некоторые значения, такие как 1982-12-12, 1823-12-12, 1992-3-3, и я не могу понять запрос, чтобы перечислить все имена, которые имеют дату рождения. Я пытался выяснить функции Date() и Time(), найденные по адресу: http://www.sqlite.org/lang_datefunc.html, и я не знаю, как их применять к этому запросу. –

ответ

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 

так что если вам хотел бы, чтобы вы могли ГРУЗИТЬ по этому сроку:

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) ; 

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

+0

Очень, очень полезно. Думаю, я больше понимаю. Как я могу только перечислять имена, которые имеют совпадение? Итак, Алиса и Кейт будут показаны вместе с двумя другими людьми, которые делят дату рождения. –

+0

Я добавил пример получения всех подходящих дней рождения. Это может быть излишним, но достаточно легко похудеть. –

Смежные вопросы