我正在努力在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,或者SQL Server不适用于SQLite。
如果没有用户定义的函数,SQLite中的查询会如何?
答案 0 :(得分:2)
我使用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
衣| 0.520561488810927
约翰| 3.52056147716939
快速解释:
julianday(strftime('%Y', 'now')
< - 这会拉动当前年份,因此数据1的julianday不会考虑80年代的年份
||strftime('-%m-%d', data1))
< - 这将实际生日的月/日连接到当前年份
where birthday between -1 and 30;
< - -1确保您通过'今天'一直看到结果。 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
衣| 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年7月2日|约翰| -3.65773148148151
1979年6月29日|衣| -0.657731481481505
1986年6月28日|天使| 0.342268518518495
1984年6月26日|标志| 2.34226851851849
1987年2月16日|马特| 132.342268518519
因此,今年即将到来的生日将是负面的(例如约翰在未来的3天),今年已经过的生日将是积极的。
这应该允许正确的排序。
答案 1 :(得分:-1)
我没有SQLLite可供测试,但这应该可以解决问题......
选择JULIANDAY('现在') - JULIANDAY(data1) 来自contact_birthday JULIANDAY的命令('现在') - JULIANDAY(data1)
您也可以使用STRFTIME功能,但我发现JULIANDAY功能更具可读性。