Получить следующую пятницу, если, если это уже пятница - PullRequest
0 голосов
/ 11 марта 2020

Заголовок problaby выдает то, что я пытаюсь сделать, это просто любопытство, я пытаюсь найти следующую пятницу из набора дат, но если эта дата - пятница, я хочу вернуть эту дату, а не далее.

Вот что я пытаюсь сделать: (Используя таблицу сотрудников из Oracle)

SELECT first_name,
     CASE WHEN to_char(hire_date, 'DAY') = 'FRIDAY' THEN hire_date
          ELSE next_day(hire_date, 'FRIDAY')
     END as next_friday, hire_date, to_char(hire_date, 'DAY')
FROM hr.employees;

enter image description here

Я не вижу, что не так с запросом (у этих двух отмеченных записей дата должна быть одинаковой во 2-м и 3-м столбце), с моей точки зрения это логически правильно, я сделал заявление CASE и преобразовал hire_date с помощью to_char чтобы узнать, была ли это пятница, и возвращала ли она hire_date, иначе верните следующую пятницу, используя функцию next_day.

Что может быть не так?

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Проще всего вычесть один день:

next_day(hire_date - interval '1' day, 'FRIDAY')

Если бы мне пришлось угадывать, проблема с вашим кодом в пробелах в конце названия дня.

0 голосов
/ 12 марта 2020

Что может быть не так?

Ваш запрос почти правильный; однако to_char(hire_date, 'DAY') возвращает строку фиксированной длины с 9 символами (поскольку это длина самого длинного имени дня WEDNESDAY, когда используется английский язык sh), а более короткие дни заполняются справа пробелами.

Просто добавьте правую клавишу дня, чтобы в ней было 9 символов:

SELECT first_name,
       CASE
       WHEN to_char(hire_date, 'DAY') = 'FRIDAY   '
       THEN hire_date
       ELSE next_day(hire_date, 'FRIDAY')
       END as next_friday,
       hire_date,
       '"'||to_char(hire_date, 'DAY')||'"' AS day
FROM   employees;

Итак, для тестовых данных:

CREATE TABLE employees( first_name, hire_date ) AS
SELECT 'Alice', DATE '2020-03-09' FROM DUAL UNION ALL
SELECT 'Bob',   DATE '2020-03-10' FROM DUAL UNION ALL
SELECT 'Carol', DATE '2020-03-11' FROM DUAL UNION ALL
SELECT 'David', DATE '2020-03-12' FROM DUAL UNION ALL
SELECT 'Emma',  DATE '2020-03-13' FROM DUAL UNION ALL
SELECT 'Fred',  DATE '2020-03-14' FROM DUAL UNION ALL
SELECT 'Gemma', DATE '2020-03-15' FROM DUAL;

Это выводит:

FIRST_NAME | NEXT_FRIDAY | HIRE_DATE | DAY        
:--------- | :---------- | :-------- | :----------
Alice      | 13-MAR-20   | 09-MAR-20 | "MONDAY   "
Bob        | 13-MAR-20   | 10-MAR-20 | "TUESDAY  "
Carol      | 13-MAR-20   | 11-MAR-20 | "WEDNESDAY"
David      | 13-MAR-20   | 12-MAR-20 | "THURSDAY "
Emma       | 13-MAR-20   | 13-MAR-20 | "FRIDAY   "
Fred       | 20-MAR-20   | 14-MAR-20 | "SATURDAY "
Gemma      | 20-MAR-20   | 15-MAR-20 | "SUNDAY   "

дБ <> скрипка здесь

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