如何在 Oracle 中检测给定年份是否为闰年?

oraclesoftware & codingprogramming更新于 2025/6/2 23:37:17

问题:

您需要确定任何给定年份是否为闰年。

解决方案:

有许多方法可以解决这个问题。这些方法包括计算以确定一年中是否存在 2 月 29 日,或者 3 月 1 日是一年中的第 61 天还是第 62 天。

示例

SELECT to_number(to_char(sysdate,'YYYY')) Year,   CASE     WHEN MOD(to_number(to_char(sysdate,'YYYY')),400) = 0 then 'Yes'     WHEN MOD(to_number(to_char(sysdate,'YYYY')),100) = 0 then 'No'     WHEN MOD(to_number(to_char(sysdate,'YYYY')),4) = 0 then 'Yes'     ELSE 'No'     END AS "Leap Year?" FROM dual;

输出

2020    Yes

显然 2020 年是一个值得忘记的年份,而且是闰年。让我们在非闰年尝试一下,例如 2019 年

示例

SELECT '2019' Year,   CASE     WHEN MOD(2019,400) = 0 then 'Yes'     WHEN MOD(2019,100) = 0 then 'No'     WHEN MOD(2019,4) = 0 then 'Yes'     ELSE 'No'     END AS "Leap Year?" FROM dual;

输出

2019    No

该解决方案基于闰年的标准定义,该定义源自年份数字。标准算法规定,如果年份可以被四整除,则为闰年。但是,如果年份也可以被 100 整除,则这将覆盖可以被四整除的规则,该年份不是闰年。最后,如果年份也可以被 400 整除,则这将覆盖所有其他规则,该年份为闰年。

上述步骤序列在我们的 SQL 中使用 CASE 语句进行。

我们使用 CASE 语句来驱动闰年检测的主体。我们在 case 语句中反向应用闰年算法,以利用 CASE 语句的行为。一旦找到匹配的规则,CASE 语句就会中断。这意味着我们要首先评估最重要的规则,即覆盖所有其他规则的规则,即年份是否可以被 400 整除?如果结果为假,我们想要评估下一个最严格的规则——除以 100——依此类推。

我们使用 MOD 函数执行模数除法。首先,如果年份模数 400 没有余数,我们知道它正好可以被 400 整除,因此是闰年。对于这种情况,我们返回字符串 Leap Year,CASE 语句结束。如果年份模数 400 有余数,我们知道它不是闰年,然后继续对年份执行模数除以 100。如果没有余数,我们知道年份正好可以被 100 整除,因此不是闰年。我们之所以知道这一点,是因为如果年份也能被 400 整除,我们就不会评估 CASE 表达式的这一部分,因为 CASE 语句已经终止。

同样,如果两个模数除法都有余数,我们将转到第三个模数除法,该除法求出年份除以四的余数。同样,如果没有余数,我们知道前两个规则没有匹配,因此该年份是闰年。

此时,我们的 CASE 语句已经用尽,我们知道该年份没有匹配任何用于查找闰年的明确规则。


相关文章