如何在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年。对于这种情况,我们返回字符串LeapYear,并且CASE语句结束。如果我们的年份模数400有余数,我们就知道它不是a年,然后继续对该年份除以100进行模数除法。如果没有余数,我们就知道该年份可以被100整除,因此不是。a年。我们之所以知道这一点,是因为如果年份也可以被400整除,那么我们就不会评估CASE表达式的这一部分,因为CASE语句已经终止。
类似地,如果两个模数除法都有余数,我们就进入第三模数除法,即找到将年份除以四的余数。再说一次,如果没有余数,我们就知道前两个规则没有匹配,因此年份是is年。
至此,我们的CASE声明已经用尽,并且我们知道该年份与查找a年的任何明确规则都不匹配。