我正在努力在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/