我正在努力在SQLite中找到一个有效的查询,该查询将在即将到来的生日返回我的记录以及发生的天数

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


data1以YYYY-MM-DD格式保存生日

就像是:

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


我发现了其他一些结果,但它们适用于MySQL或SQLite,而不适用于SQLite。

没有用户定义函数的SQLite中的查询将如何?

最佳答案

我让它使用julianday(获取“天”计数AFAIK的唯一方法)工作

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

我的结果:

天使| -0.479438499547541
Bea | 0.520561488810927
约翰| 3.52056147716939

快速说明:
julianday(strftime('%Y', 'now') ||strftime('-%m-%d', data1)) where birthday between -1 and 30; 编辑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;

结果:

天使| -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天的动态计算,因为leap年可以是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:[Matt]
这实际上可能为您工作:
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 | John | -3.65773148148151
1979-06-29 | Bea | -0.657731481481505
1986-06-28 |天使| 0.342268518518495
1984-06-26 |马克| 2.34226851851849
1987-02-16 |马特| 132.342268518519

因此,当年即将到来的生日将是负数(例如,约翰在未来的日子中是3天),今年已经过去的生日将是正数。
这应该允许正确的排序。

关于sql - 如何获取即将到来的生日订单中的记录?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3131840/

10-13 22:11