【“DDD”】今年共有多少天?

单纯的使用SQL,有没有办法快速得到今年一共有多少天,是365天还是366天,还是……?
回答是肯定的,万能的SQL一定不会辜负我们对他的期望。请见此文分解。

1.思路
想办法得到今年最后一天的日期,然后使用to_char函数的“DDD”参数(此参数用于返回给定日期对应一年中的第几天)便可知晓今年共有多少天。

2.我们来逐步达到最终目标
1)使用当前时间(sysdate)得到今年的第一天:2010-01-01
sec@ora10g> select trunc(sysdate,'y') from dual;

TRUNC(SYSDATE,'Y')
-------------------
2010-01-01 00:00:00

2)在此基础上增加12个月便可得到明年的第一天:2011-01-01
sec@ora10g> select add_months(trunc(sysdate,'y'),12) from dual;

ADD_MONTHS(TRUNC(SY
-------------------
2011-01-01 00:00:00

3)明年第一天减去一天便得到了今年的最后一天日期:2010-12-31
sec@ora10g> select add_months(trunc(sysdate,'y'),12)-1 from dual;

ADD_MONTHS(TRUNC(SY
-------------------
2010-12-31 00:00:00

4)最后我们使用TO_CHAR函数的“DDD”参数得到今年共有多少天
sec@ora10g> select to_char(add_months(trunc(sysdate,'y'),12)-1,'DDD')||' Days' as "How many days in this year?" from dual;

How many days in this year?
---------------------------
365 Days

3.有关TO_CHAR函数“DDD”参数的描述请参考Oracle的官方文档描述
http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/sql_elements004.htm#i34924
中的“Table 2-15 Datetime Format Elements”中有关于“DDD”格式的说明。
DDD

Yes

Day of year (1-366).



4.其实只要知道每年的最后一天便可以快速的获得每年包含的总天数
sec@ora10g> select to_char(to_date('2010-12-31','yyyy-mm-dd'),'DDD') as "How many days in this year?" from dual;

How many days in this year?
---------------------------
365

sec@ora10g> col "How many days in 2004?" for a44
sec@ora10g> select to_char(to_date('2004-12-31','yyyy-mm-dd'),'DDD') as "How many days in 2004?" from dual;

How many days in 2004?
--------------------------------------------
366

sec@ora10g> col "How many days in 2005?" for a44
sec@ora10g> select to_char(to_date('2005-12-31','yyyy-mm-dd'),'DDD') as "How many days in 2005?" from dual;

How many days in 2005?
--------------------------------------------
365

5.小结
SQL的魅力在于她的灵活多变,随心所欲,我们仅需掌握一些基本的规则便可以实现我们诸多想法。
SQL,永恒的话题。

Good luck.

secooler
10.02.08

-- The End --

请使用浏览器的分享功能分享到微信等