Я заставил его работать, используя 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 дня в БУДУЩЕМ), дни рождения, которые уже прошли в этом году, будут положительными.
Это должно обеспечить правильное оформление заказа.