如何在即将到来的生日订单中获取记录?

时间:2010-06-28 11:15:30

标签: sql sqlite

我正在努力在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中的查询会如何?

2 个答案:

答案 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功能更具可读性。