Как получить записи в предстоящем порядке рождения? - PullRequest
2 голосов
/ 28 июня 2010

Я изо всех сил пытаюсь найти рабочий запрос в SQLite, который вернет мои записи в их предстоящий день рождения вместе с количеством дней, когда это произойдет

CREATE TABLE contact_birthday ('contact_id' varchar,'data1' varchar,'display_name' varchar)

data1 отмечает день рождения в формате ГГГГ-ММ-ДД

Что-то вроде:

"1986-06-28","Angel","0"
"1979-06-29","Bea","1"
"1984-07-02","John","4"
"1984-06-26","Mark","364"

Я нашел некоторые другие результаты, но они работают для MySQL или SQL Server не в SQLite.

Каким будет запрос в SQLite без пользовательских функций?

Ответы [ 2 ]

2 голосов
/ 28 июня 2010

Я заставил его работать, используя julianday (единственный способ подсчитать «день» AFAIK)

select name,
julianday(strftime('%Y', 'now')||strftime('-%m-%d', data1))-julianday('now') as birthday
from foo
where birthday between -1 and 30;

Мой результат:

Angel | -0,479438499547541

Bea | +0,520561488810927

Джон | +3,52056147716939

Быстрое объяснение:

julianday(strftime('%Y', 'now') <- это тянет текущий год, так что julianday для data1 не учитывает годы с 80-х </p>

||strftime('-%m-%d', data1)) <- объединяет месяц / день фактического дня рождения с текущим годом </p>

where birthday between -1 and 30; <- -1 гарантирует, что вы увидите результаты вплоть до «сегодня». 30 - это максимальное количество дней, которое вы хотите увидеть заранее. </p>

Редактировать 1 :

Вот модификация, которая использует секунды с 1970 года, а не юлианский день:

select name,
(strftime('%s',strftime('%Y', 'now')||strftime('-%m-%d', data1))-strftime('%s','now'))/86400.0 as birthday
from foo
where birthday between -1 and 30
order by birthday;

Результат:

Angel | -0,487118055555556

Bea | +0,512881944444445

Джон | +3,51288194444444

Редактировать 2 : [Pentium10]

включает правильное местное время

select data1,display_name,
(strftime('%s',strftime('%Y', 'now','localtime')||strftime('-%m-%d', data1))-strftime('%s','now','localtime'))/86400.0 as birthday
from contact_birthday
order by birthday asc

Редактировать 3 : [Pentium10]

включает заказ, если с сегодняшнего дня до следующего года это время ровно 365 дней
** все еще требуется динамический расчет 365 дней, поскольку для високосных лет это может быть 366

select data1,display_name,
((strftime('%s',strftime('%Y', 'now','localtime')||strftime('-%m-%d', data1))-strftime('%s','now','localtime'))/86400.0+1+365) % 365 as birthday
from contact_birthday
order by birthday asc

Редактировать 4 : [Мэтт]

Это на самом деле может работать для вас:

select data1,name,
365-(strftime('%s',strftime('%Y', 'now', '+1 year', 'localtime')||strftime('-%m-%d', data1))-strftime('%s','now','localtime'))/86400.0 as birthday
from foo
order by birthday asc

Редактировать 5 : [Pentium10]
ОТВЕТ

select data1,display_name,
((strftime('%s',strftime('%Y', 'now','localtime')||strftime('-%m-%d', data1))-strftime('%s','now','localtime'))/86400.0+1+((strftime('%s','now', 'localtime','+1 year')-strftime('%s','now',  'localtime'))/86400.0)) % ((strftime('%s','now', 'localtime','+1 year')-strftime('%s','now',  'localtime'))/86400.0) as indays
from contact_birthday
order by indays asc

Результат:

1984-07-02 | Джон | -3,65773148148151

1979-06-29 | Bea | -0,657731481481505

1986-06-28 | Angel | +0,342268518518495

1984-06-26 | Марка | +2,34226851851849

1987-02-16 | Matt | +132,342268518519

Таким образом, дни рождения, которые ожидаются в текущем году, будут отрицательными (например, у Джона 3 дня в БУДУЩЕМ), дни рождения, которые уже прошли в этом году, будут положительными.

Это должно обеспечить правильное оформление заказа.

0 голосов
/ 28 июня 2010

У меня нет SQLLite для тестирования, но это должно сработать ...

ВЫБРАТЬ JULIANDAY ('NOW') - JULIANDAY (data1) FROM contact_birthday ORDER BY JULIANDAY ('NOW')- JULIANDAY (data1)

Вы также можете использовать функцию STRFTIME, но я считаю, что функция JULIANDAY более удобочитаема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...