#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;