在Oracle是提供了next_day求指定日期的下一個日期.
語法 : next_day( date, weekday )
date is used to find the next weekday.
weekday is a day of the week (ie: SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY)
可用於:
Oracle 9i, Oracle 10g, Oracle 11g
舉例:
可以求出當前日期的下個星期一。
select next_day( sysdate, 'MONDAY') from dual;
使用方法並不複雜,主要注意如下:
1) 當第二個參數傳的星期數比現有星期數小的時候,會返回下一個星期的日期;當第二個參數所傳的星期數比 現有的星期數大的時候,則會返回本週的相應星期日期。
例如:
ps:請注意如下紅色字體。
SQL> select sysdate from dual;
SYSDATE
-------------------
2010-12-30 19:30:26
1 row selected.
Elapsed: 00:00:00.01
SQL> select next_day(sysdate,'tuesday') from dual;
NEXT_DAY(SYSDATE,'T
-------------------
2011-01-04 18:57:37
1 row selected.
Elapsed: 00:00:00.01
SQL>
SQL> select next_day(sysdate,'MONDAY') from dual;
NEXT_DAY(SYSDATE,'M
-------------------
2011-01-03 18:58:45
1 row selected.
Elapsed: 00:00:00.00
SQL> select next_day(sysdate,'WEDNESDAY') from dual;
NEXT_DAY(SYSDATE,'W
-------------------
2011-01-05 18:59:15
1 row selected.
Elapsed: 00:00:00.00
SQL> select next_day(sysdate,'THURSDAY') from dual;
NEXT_DAY(SYSDATE,'T
-------------------
2011-01-06 18:59:30
1 row selected.
Elapsed: 00:00:00.00
SQL> select next_day(sysdate,'FRIDAY') from dual;
NEXT_DAY(SYSDATE,'F
-------------------
2010-12-31 18:59:43
1 row selected.
Elapsed: 00:00:00.00
SQL> select next_day(sysdate,'SATURDAY') from dual;
NEXT_DAY(SYSDATE,'S
-------------------
2011-01-01 19:00:19
1 row selected.
Elapsed: 00:00:00.01
SQL> select next_day(sysdate,'SUNDAY') from dual;
NEXT_DAY(SYSDATE,'S
-------------------
2011-01-02 19:00:37
1 row selected.
Elapsed: 00:00:00.00
2)好的方法
統計上個星期日到上個星期六的總和,
具體寫法:
l_begin_date ~ l_end_date:
NEXT_DAY(SYSDATE-7*2-1,'sunday') ~ NEXT_DAY(SYSDATE-7-2,'saturday')
然後再在程序中作判斷:
IF l_begin_date>NEXT_DAY(SYSDATE-7*2-1,'sunday')
--限制統計開始日期必須是週日
OR TO_CHAR(l_begin_date,'d')<>1
--限制統計結束日期必須是週六
OR TO_CHAR(l_end_date,'d')<>7
--限制開始日期和結束日期時間間隔必須是一週
OR l_end_date-l_begin_date<>6
THEN
raise_application_error(-20503,'you enter error parameter');
END IF;
--每週一跑數據,其它時候空跑
IF TO_CHAR(SYSDATE,'d')=2
THEN
*****************
end IF;