Для того, чтобы определить день недели довольно использовать функцию TO_CHAR вот таким образом: select to_char(to_date('01.07.2011','dd.mm.yyyy'), 'd') from dual;
В результате получаем порядковый номер дня недели: от 1 до 7.
Какой день недели считать первым зависит от параметра NLS_TERRITORY/
А для ответа на 2-ой вопрос нужно выполнить вот такой требование :
select trunc(to_date('01.07.2011','dd.mm.yyyy'),'D') from dual ;