Oracle: запрос, чтобы получить последнюю пятницу недели, если я укажу любую дату

#sql #oracle

#sql #Oracle

Вопрос:

Если я укажу дату, скажем, ’13 марта 2019′, мой запрос должен получить значение ’15 марта 2019′. Которая является последней пятницей недели.

Комментарии:

1. Последняя пятница — это единственная пятница недели — на каждой неделе только одна пятница 😉

Ответ №1:

Перенесите дату на неделю ISO, что приведет к понедельнику недели (поскольку неделя ISO начинается с понедельника). Затем добавьте четыре дня:

 select trunc(date '2019-03-13', 'iw')   4 from dual;
  

Комментарии:

1. Большое спасибо за ваш ответ. Запрос выдает желаемый результат.

Ответ №2:

Я бы использовал next_day() . Это функция Oracle, специально разработанная для этой цели.

 select next_day(date '2019-03-13', 'Fri')
from dual;
  

Единственный нюанс заключается в том, что если дата — пятница, то она вернется в следующую пятницу. Возможно, это то, чего ты хочешь. В противном случае просто вычтите один день:

 select next_day(date '2019-03-13' - 1, 'Fri') as friday_end_of_week
from dual;
  

Ответ №3:

Попробуйте ниже —

 select trunc(to_date('13-Mar-2019'), 'iw')   4 from dual
  

Комментарии:

1. Не используйте TO_DATE без формата, потому что тогда вы полагаетесь на NLS_TERRITORY настройки сеанса, и ваш запрос может завершиться ошибкой. С названием месяца вам даже придется указать NLS_DATE_LANGUAGE , чтобы сохранить его для воспроизведения. Правильным TO_DATE выражением было бы TO_DATE('13-Mar-2019', 'dd-Mon-yyyy', 'nls_date_language=english') . Для фиксированной даты вместо этого используйте литерал даты: date '2019-03-13' .

Ответ №4:

 SELECT NEXT_DAY( to_date('2019-03-13', 'yyyy-mm-dd'), to_char(to_date('2019-03-01', 'yyyy-mm-dd'), 'DAY')) FROM dual;
  

ДЕМОНСТРАЦИЯ