Подсчитать сколько воскресений , понедельников , суббот и тд в заданном году

добавлено: 20 мар 17
понравилось:0
просмотров: 5133
комментов: 2

теги:

Автор: Myp3_u_K

Учебный тренинг. SQL от новичка до профессионала.
Бесплатные авторские видеокурсы SQL, PLSQL, JAVA

Подсчитать количество дней недели в заданном году
то есть сколько было в указанном году понедельников вторников воскресений ...
можно следующим образом :
   select count(1) dwcount,
          to_char(to_date('01/01/1940', 'DD/MM/YYYY') + level - 1, 'DAY') daywe -- 1940 это год , который нам нужен
     from dual
   connect by level <
              to_number(to_char(Trunc(To_Date(1940 + 1, 'YYYY'), 'YYYY') - 1, -- 1940 это год , который нам нужен
                                'ddd')) -- считаем колч дней 
    group by to_char(to_date('01/01/1940', 'DD/MM/YYYY') + level - 1, 'DAY'); -- группируем запрос по дням

один читатель, предложил свое решение, более рациональное и эффективное, подвергнув мое решение справедливой критике, публикую
  with t as (select to_date('31/12/'||'1940','dd/mm/yyyy') fd_year from dual)
    select to_char(t.fd_year-level+1,'DAY') fv_day,count(1) fn_count from t
    connect by level <= to_number(to_char(t.fd_year,'ddd'))
  group by to_char(t.fd_year-level+1,'DAY')

Комментарии


  • это классическая задача с собеседования...

  • Альтернативный вариант без прохода по всем дням года:
    [spoiler][SRC sql]with
    t1 as (select to_date('31/12/'|| to_char(1979+level),'dd/mm/yyyy') last_day_year
    from dual connect by level <= 10),
    t2 as (select trunc(last_day_year, 'YYYY') first_day_year,
    last_day_year,
    to_number(to_char(trunc(last_day_year, 'YYYY'),'D')) first_day_week_numb
    from t1),
    t3 as (select level day_week_numb from dual connect by level <=7),
    t as (select t2.last_day_year,
    t3.day_week_numb,
    case when (t3.day_week_numb-t2.first_day_week_numb) >= 0
    then first_day_year + (t3.day_week_numb-t2.first_day_week_numb)
    else first_day_year + (t3.day_week_numb-t2.first_day_week_numb) + 7
    end day_week_date
    from t2, t3)
    select to_char(day_week_date, 'YYYY') year_string,
    day_week_date,
    day_week_numb,
    to_char(day_week_date, 'DAY') day_week_string,
    floor((last_day_year - day_week_date)/7) + 1 q
    from t
    order by day_week_date[/SRC][/spoiler]



Необходимо войти на сайт, чтобы оставлять комментарии