0
查询应返回每个月的最后一周。例如,如果2013年3月的最后一周是星期天,则查询应显示29月3日2013(星期五)。查询使用oracle sql查找每年的每个月的最后一周的日期sql
查询应返回每个月的最后一周。例如,如果2013年3月的最后一周是星期天,则查询应显示29月3日2013(星期五)。查询使用oracle sql查找每年的每个月的最后一周的日期sql
试试这个:
select dte as last_day, dayofweek_abbr as original_dayofweek,
dte - (decode(dayofweek, 7, 1, 1, 2, 0)) as last_weekday_america
from (
select last_day(to_date(to_char(level, '09') || '2013', 'MMYYYY')) as dte,
to_char(last_day(to_date(to_char(level, '09') || '2013', 'MMYYYY')), 'D') as dayofweek,
to_char(last_day(to_date(to_char(level, '09') || '2013', 'MMYYYY')), 'DAY') as dayofweek_abbr
from dual
connect by level <= 12
)
输出:
LAST_DAY ORIGINAL_DAYOFWEEK LAST_WEEKDAY_AMERICA
1/31/2013 THURSDAY 1/31/2013
2/28/2013 THURSDAY 2/28/2013
3/31/2013 SUNDAY 3/29/2013
4/30/2013 TUESDAY 4/30/2013
5/31/2013 FRIDAY 5/31/2013
6/30/2013 SUNDAY 6/28/2013
7/31/2013 WEDNESDAY 7/31/2013
8/31/2013 SATURDAY 8/30/2013
9/30/2013 MONDAY 9/30/2013
10/31/2013 THURSDAY 10/31/2013
11/30/2013 SATURDAY 11/29/2013
12/31/2013 TUESDAY 12/31/2013
需要注意的是,如果你的NLS_TERRITORY是不同的,你可能需要调整解码。
跟随Ed的提示和tbone的代码。以您想要的方式格式化日期。 FMDAY格式化程序在一周之后删除多余的空格。
SELECT dte AS last_day,
dayofweek_abbr AS original_dayofweek,
to_char(dte - (decode(dayofweek, 7, 1, 1, 2, 0)),'DD MON YYYY(FMDAY)') AS last_weekday_america
FROM (
SELECT last_day(to_date(to_char(level, '09') || '2013', 'MMYYYY')) as dte,
to_char(last_day(to_date(to_char(level, '09') || '2013', 'MMYYYY')), 'D') as dayofweek,
to_char(last_day(to_date(to_char(level, '09') || '2013', 'MMYYYY')), 'DAY') as dayofweek_abbr
FROM dual
CONNECT BY LEVEL <= 12
)
你可以发布你到目前为止尝试过的吗? StackOverflow是关于帮助已经尝试过并且未能解决问题的人们;这不是关于发布作业答案。 “每个月”是什么意思? Oracle日期范围可以从公元前4712年到9999年ACE,因此“每月”可能意味着超过176,000个月。我可以给你这么多:查看Oracle ['LAST_DAY'](http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions077.htm#i83733)函数。 –
考虑使用日历表。看看这个答案http://stackoverflow.com/a/5123255/472226 – Ronnis