Количество дней между двумя датами без учёта суббот и воскресений

novichok91
Дата: 17.10.2015 13:59:32
Привет всем!
Вот написал запрос на вычисление количества дней между датами, но он почемуто не выкидывает субботы и воскресенья. Подскажите в чём проблема?
SELECT COUNT(*)
FROM (SELECT ROWNUM rnum
      FROM all_objects
      WHERE ROWNUM <= to_date('31.10.2015') - to_date('1.8.2015')+1)
WHERE to_char( to_date('1.8.2015')+rnum-1, 'DY' ) NOT IN ( 'SAT', 'SUN' );
Добрый Э - Эх
Дата: 17.10.2015 14:30:23
novichok91,

А почему ты решил, что нужно проверять на SAT и SUN, а не на СБ и ВС, ZAT и ZON, SAM и SOM, или СЪБ и НЕД?
С чего такая уверенность, что оракл будет разговаривать с тобой на английском языке?
orawish
Дата: 17.10.2015 14:34:04
novichok91,

форматную маску (с прямым углом) попутали
а ещё, когда заработает, про исключить нлс-зависимость подумайте

ну и тема - баян. в поиске найдёте, если что
Добрый Э - Эх
Дата: 17.10.2015 14:34:10
ну и это тоже та ещё бомба замедленного действия:[quot novichok91]
>> ...    >to_date('31.10.2015')<<<   ...
тебе крупно повезло, что оно ещё до сих пор не стрельнуло...
novichok91
Дата: 17.10.2015 14:36:39
Добрый Э - Эх
novichok91,

А почему ты решил, что нужно проверять на SAT и SUN, а не на СБ и ВС, ZAT и ZON, SAM и SOM, или СЪБ и НЕД?
С чего такая уверенность, что оракл будет разговаривать с тобой на английском языке?



А можно ли как-то написать такой запрос без проверки суббот и воскресений напрямую. Видел на форуме такой запрос
select sum(case when to_char(trunc(sysdate)-rownum,'d') in (1,7) then 0 else 1 end) from all_objects where rownum<=trunc(sysdate)-trunc(sysdate-55);
, но он работает через sysdate минус число дней, а мне надо, чтобы даты ввести можно было.
novichok91
Дата: 17.10.2015 15:10:16
select sum(case when to_char(trunc(to_date('1.10.2015'))-rownum,'d') in (1,7) 
then 0 else 1 end) 
from all_objects 
where rownum<=trunc(to_date('1.10.2015'))-trunc(to_date('1.10.2015')-to_date('10.10.2015'));


ORA-00932: несовместимые типы данных: ожидается NUMBER, получено DATE
00932. 00000 - "inconsistent datatypes: expected %s got %s"

Как здесь правильно преобразовать дату в число для корректной работы секции where?
трункатор
Дата: 17.10.2015 15:10:57
novichok91,

а оллобжектс то зачем приплетать. арифметику в школе не учил?
SY
Дата: 17.10.2015 15:23:41
novichok91
Видел на форуме такой запрос, но он работает ...


Опять таки он HE работает посколько формат d NLS зависим и мне 1 и 7 вернется в воскресенье и в субботу а вот тебе в понедельник и воскресенье.

SELECT  COUNT(*)
  FROM  DUAL
  WHERE to_char(to_date('1.8.2015','dd.mm.yyyy') + LEVEL - 1,'dy','nls_date_language=english') not in ('sat','sun')
  CONNECT BY LEVEL <= to_date('31.10.2015','dd.mm.yyyy') - to_date('1.8.2015','dd.mm.yyyy') + 1
/
novichok91
Дата: 17.10.2015 15:34:50
SY
novichok91
Видел на форуме такой запрос, но он работает ...


Опять таки он HE работает посколько формат d NLS зависим и мне 1 и 7 вернется в воскресенье и в субботу а вот тебе в понедельник и воскресенье.

SELECT  COUNT(*)
  FROM  DUAL
  WHERE to_char(to_date('1.8.2015','dd.mm.yyyy') + LEVEL - 1,'dy','nls_date_language=english') not in ('sat','sun')
  CONNECT BY LEVEL <= to_date('31.10.2015','dd.mm.yyyy') - to_date('1.8.2015','dd.mm.yyyy') + 1
/


Понятно, спасибо большое!
SY
Дата: 17.10.2015 16:03:56
Через ISO стандарт (неделя всегда начинается в понедельник):

WITH T AS (
           SELECT  to_date('1.8.2015','dd.mm.yyyy') + LEVEL - 1 dt
             FROM  DUAL
             CONNECT BY LEVEL <= to_date('31.10.2015','dd.mm.yyyy') - to_date('1.8.2015','dd.mm.yyyy') + 1
          )
SELECT  COUNT(*)
  FROM  T
  WHERE dt - TRUNC(dt,'IW') < 5
/


SY.