如何在Oracle中确定给定年份是否为Le年?

问题:

您需要确定给定的年份是否为year年。

解:

解决此问题的方法有很多,其中包括确定该年是否存在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年的非leap年尝试一下

示例

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

该解决方案基于a年的标准定义,,年源自年数。标准算法指出,如果一年可被四整除,则为a年。但是,如果年份也可以被100整除,那么它将覆盖四分频规则,并且该年份不是it年。最后,如果年份也可以被400整除,那么它将覆盖所有其他规则,并且年份是a年。

在我们的SQL中,紧随其后的步骤序列带有CASE语句。

我们使用CASE语句来驱动leap年检测的主体。我们在case语句中反向应用the年算法,以利用CASE语句的行为。一旦找到匹配的规则,CASE语句就会中断。这意味着我们要首先评估最重要的规则,该规则优先于所有其他规则,那么年份是否可以除以400?如果那是错误的话,我们想评估下一个最严格的规则-除以100-依此类推。

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

类似地,如果两个模数除法都有余数,我们就进入第三模数除法,即找到将年份除以四的余数。再说一次,如果没有余数,我们就知道前两个规则没有匹配,因此年份是is年。

至此,我们的CASE声明已经用尽,并且我们知道该年份与查找a年的任何明确规则都不匹配。

以上是 如何在Oracle中确定给定年份是否为Le年? 的全部内容, 来源链接: utcz.com/z/338017.html

回到顶部