加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

postgresql – Postgres生日选择

发布时间:2020-12-13 16:30:21 所属栏目:百科 来源:网络整理
导读:我使用Postgres数据库.此DB具有一个包含用户的表,该用户具有生日(日期字段).现在我想让所有在即将到来的一周里过生日的用户…. 我的第一次尝试:SELECT id FROM public.users WHERE id IN(lange reeks)AND birthdate NOW()和birthdate现在()间隔'1周' 但这并
我使用Postgres数据库.此DB具有一个包含用户的表,该用户具有生日(日期字段).现在我想让所有在即将到来的一周里过生日的用户….

我的第一次尝试:SELECT id FROM public.users WHERE id IN(lange reeks)AND birthdate> NOW()和birthdate<现在()间隔'1周' 但这并没有结果,显然是因为一年之后.我该如何解决这个问题? 有没有人知道PG在29-02生日会发生什么事情?

我们可以使用postgres函数以非常好的方式执行此操作.

假设我们有一个表人,在列dob中有一个出生日期,这是一个日期,我们可以创建一个函数,允许我们将该列索引,而忽略年份. (感谢Zoltán B?sz?rményi):

CREATE OR REPLACE FUNCTION indexable_month_day(date) RETURNS TEXT as $BODY$
  SELECT to_char($1,'MM-DD');
$BODY$language 'sql' IMMUTABLE STRICT;

CREATE INDEX person_birthday_idx ON people (indexable_month_day(dob));

现在,我们需要查询表和索引.例如,为了让每个人在任何一年的4月份过生日:

SELECT * FROM people 
WHERE 
    indexable_month_day(dob) >= '04-01'
AND 
    indexable_month_day(dob) < '05-01';

有一个问题:如果我们的开始/结束时段超过一年的边界,我们需要更改查询:

SELECT * FROM people 
WHERE 
    indexable_month_day(dob) >= '12-29'
OR 
    indexable_month_day(dob) < '01-04';

为了确保我们匹配闰日生日,我们需要知道我们是否会向前或向后“移动”它们.就我而言,两天都匹配起来比较简单,所以我的常规查询如下:

SELECT * FROM people 
WHERE 
    indexable_month_day(dob) > '%(start)%'
%(AND|OR)%
    indexable_month_day(dob) < '%(finish)%';

我有一个django queryset方法,使这更简单:

def birthday_between(self,start,finish):
    """Return the members of this queryset whose birthdays
    lie on or between start and finish."""
    start = start - datetime.timedelta(1)
    finish = finish + datetime.timedelta(1)
    return self.extra(where=["indexable_month_day(dob) < '%(finish)s' %(andor)s indexable_month_day(dob) > %(start)s" % {
        'start': start.strftime('%m-%d'),'finish': finish.strftime('%m-%d'),'andor': 'and if start.year == finish.year else 'or'
    }]

def birthday_on(self,date):
    return self.birthday_between(date,date)

现在,我可以做以下事情:

Person.objects.birthday_on(datetime.date.today())

仅在前一天或仅在后一天匹配闰日生日:您只需将SQL测试更改为“> =”或“< =”,而不是调整开始/结束时间python函数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读