对于我的Python应用程序,我将生日以yyyy-mm-dd的格式存储在数据库中,年份(yyyy)始终是2020,所以我允许闰年日期为2月29日,这个系统对我来说运行良好.我只需要从数据库中获取月份+天数,忽略年份.然而,现在我想创建一个函数,返回即将到来的生日.

我try 了一个简单的SQL查询,像这样:

SELECT user_id, DATE_FORMAT(birthday, '%m-%d') AS upcoming_birthday 
FROM birthdays 
WHERE DAYOFYEAR(birthday) > DAYOFYEAR(NOW()) AND guild_id = %s 
ORDER BY DAYOFYEAR(birthday);

但这并没有考虑到"年份转换",例如,如果今天的日期是12月15日,而下一个生日是在1月,它不会返回任何东西,因为DAYOFTHEYAR较小.

我将如何创建始终准确返回下一个生日的SQL查询或Python函数?

推荐答案

创建相对于当前日期的日期编号.一些模算术可以处理负数/回绕.与即将到来的年份无关,闰日生日将在2月28日和3月1日之间排序:

SELECT user_id, DATE_FORMAT(birthday, '%m-%d') AS upcoming_birthday 
FROM birthdays 
WHERE guild_id = %s 
ORDER BY (DAYOFYEAR(birthday) - DAYOFYEAR(now()) + 366) % 366;

如果你想在一定天数内寻找生日,你可能需要将闰日偏移一个,以便它在逻辑上落在2月28日结束的范围内.

Sql相关问答推荐

当一个视图在Postgres中失效时?

从字符串中删除";1、";和";2,";,而不删除";11、";和";12、";

两个不同星期的销售额,不加成一行

将两列相加为同一表中的行的查询

需要从键-值对数据中提取值

在Athena中使用regexp提取括号前的字符串值

在 Postgres 中将结果按几十年划分

计算组内多个日期间隔go 年的累计天数

没有调用子查询的嵌套 JOIN语法是什么?

for each 客户查找每个类别的最新评分

HIVE SQL where 子句未按预期工作

计算 SQL 中的总体成功率:递归 CTE 还是替代方法?

Django only() 和 values() 不适用于 prefetch_related()

如何防止 SQL 中的负收入值并将其重新分配到接下来的月份?

PlSql 陷入死循环

在 SQL 的每行选项中 Select 最大值

如何在 Oracle 中获取此变量的值?

Lag() 获取snowflake的值变化

从多个连接返回 1 行到同一个表 - SQL Server

SQL:有没有办法根据另一列的数据细节过滤和形成另一列?