Количество пятниц между двумя датами - PullRequest
8 голосов
/ 11 февраля 2011

Как узнать количество пятниц между двумя датами (включая обе даты) с помощью оператора select в Oracle OCL?

Ответы [ 7 ]

12 голосов
/ 11 февраля 2011

Это сделает это:

select ((next_day(date2-7,'FRI')-next_day(date-1,'FRI'))/7)+1 as num_fridays
from data

Возможно, лучше, если я разобью это.Функция NEXT_DAY возвращает следующий день, который является (в данном случае пятницей) после даты.

Таким образом, найти первую пятницу после d1 будет:

next_day( d1, 'FRI')

Но если d1 является пятницей, которая вернет следующую пятницу, мы корректируем:

next_day( d1-1, 'FRI')

Аналогично, чтобы найти последнюю пятницу вплоть до d2 включительно:

next_day( d1-7, 'FRI')

Вычитание 2 дает число дней: 0, если они совпадают, 7, если они с интервалом в неделю и т. Д .:

next_day( d1-7, 'FRI') - next_day( d1-1, 'FRI') 

Преобразование в недели:

(next_day( d1-7, 'FRI') - next_day( d1-1, 'FRI')) / 7

Наконец, если они имеют одинаковую дату, мы получаем 0, но на самом деле это 1 пятница, и так далее, поэтому мы добавляем одну:

((next_day( d1-7, 'FRI') - next_day( d1-1, 'FRI')) / 7) + 1
6 голосов
/ 11 февраля 2011

Я должен добавить свои два цента за использование таблицы календаря.(Это принуждение)Использует преимущества индексов.

Может быть, мне следует создать группу из 12 шагов.Календарь стол анонимный.

2 голосов
/ 11 февраля 2011

См .:

Почему я должен рассмотреть вопрос об использовании вспомогательной календарной таблицы?

Код статьи предназначен специально для SQL Server, но методы переносимы на большинство платформ SQL.

При наличии таблицы календаря ваш запрос может быть простым:

SELECT COUNT(*) AS friday_tally
  FROM YourTable AS T1
       INNER JOIN Calendar AS C1
          ON C1.dt BETWEEN T1.start_date AND T1.end_date
 WHERE C1.day_name = 'Friday'; -- could be a numeric code
1 голос
/ 11 февраля 2011
select sum(case when trim(to_char(to_date('2009-01-01','YYYY-MM-DD')+rownum,'Day')) = 'Friday' then 1 else 0 end) number_of_fridays
from dual
connect by level <= to_date('&end_date','YYYY-MM-DD') - to_date('&start_date','YYYY-MM-DD')+1;

Оригинальный источник - http://forums.oracle.com/forums/thread.jspa?messageID=3987357&tstart=0

0 голосов
/ 18 сентября 2013

выберите ((DATEDIFF (dd, @ a, @ b)) + DATEPART (dw, (@ a-6)))) / 7

0 голосов
/ 02 мая 2012
SELECT (NEXT_DAY('31-MAY-2012','SUN')
-NEXT_DAY('04-MAR-2012','SUN'))/7 FROM DUAL
0 голосов
/ 11 февраля 2011

Попробуйте изменить это:

CREATE OR REPLACE FUNCTION F_WORKINGS_DAYS  
(V_START_DATE IN DATE, V_END_DATE IN DATE)

RETURN NUMBER IS
DAY_COUNT NUMBER := 0;
CURR_DATE DATE;

BEGIN -- loop through and update
CURR_DATE := V_START_DATE;
WHILE CURR_DATE <= V_END_DATE
LOOP
    IF TO_CHAR(CURR_DATE,'DY') NOT IN ('SAT','SUN') -- Change this bit to ignore all but Fridays
        THEN DAY_COUNT := DAY_COUNT + 1;
    END IF;
    CURR_DATE := CURR_DATE + 1;
END LOOP;

    RETURN DAY_COUNT;
END F_WORKINGS_DAYS;

/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...