Я пытаюсь изменить начало недели набора данных с понедельника на предыдущую пятницу. Общие данные будут агрегированы на уровне недели, чтобы выглядеть следующим образом.
Пятница, Суббота, Воскресенье, Понедельник, Вторник, Среда, Четверг
Лучшее, что я придумал для этого, - это оператор case, который устанавливает пятницу, субботу и воскресенье как первый день недели на следующей неделе (первый день системы - понедельник, а последний день - воскресенье).
SELECT TRANSACTIONDATE,
CASE
WHEN TO_CHAR(TRANSACTIONDATE, 'DAY') IN ('FRIDAY', 'SATURDAY',
'SUNDAY') THEN (TRUNC(TRANSACTIONDATE, 'IW')+7)
ELSE TRUNC(TRANSACTIONDATE, 'IW')
END AS TEST
FROM TRANSACTIONS
Моя логика для этого кода такова: если пт, сб или вс, то найдите первый день недели и добавьте 7, вернув первый день недели на следующей неделе.
Проблема в том, что выражение «TRUNC (TRANSACTIONDATE, 'IW') + 7» не добавляет 7 дней к началу недели.
Когда я спрашиваю
select "TRUNC(TRANSACTIONDATE, 'IW')+7" from transactions
Я получаю начало недели на следующей неделе, и это правильно.
Таким образом, все дни с пятницы по четверг будут под одним и тем же номером недели.
Есть идеи, что происходит не так, или есть ли лучший способ добиться того, что мне нужно?
Спасибо, Том
Редактировать**
Первый набор данных - это то, чего я хотел бы достичь,
Date Day Week
4/1/2018 Monday 1
4/2/2018 Tuesday 1
4/3/2018 Wednesday 1
4/4/2018 Thursday 1
4/5/2018 Friday 2
4/6/2018 Saturday 2
4/7/2018 Sunday 2
4/8/2018 Monday 2
4/9/2018 Tuesday 2
4/10/2018 Wednesday 2
4/11/2018 Thursday 2
Итак, выше вы можете видеть, что я хочу, чтобы пятница / суббота / воскресенье выпала на следующую неделю.
Это текущие системные даты / недели,
Date Day Week
4/1/2018 Monday 1
4/2/2018 Tuesday 1
4/3/2018 Wednesday 1
4/4/2018 Thursday 1
4/5/2018 Friday 1
4/6/2018 Saturday 1
4/7/2018 Sunday 1
4/8/2018 Monday 2
4/9/2018 Tuesday 2
Можете ли вы предоставить образцы данных и желаемые результаты? Я не уверен, что полностью понимаю «Я пытаюсь изменить начало недели набора данных с понедельника на предыдущую пятницу».
Да, я добавил это к вопросу.
Проблема в TO_CHAR(TRANSACTIONDATE, 'DAY')
При использовании 'DAY'
название дня недели дополняется пробелами. Попробуйте SELECT '<'||TO_CHAR(DATE '2018-05-07', 'DAY')||'>' from dual;
, чтобы увидеть эффект.
Функция TO_CHAR(..., 'DAY')
возвращает название дня недели в соответствии с настройками текущего сеанса пользователя NLS_DATE_LANGUAGE
. Это может быть английский или нет.
Измените свое выражение, например, на
TO_CHAR(TRANSACTIONDATE, 'fmDAY', 'NLS_DATE_LANGUAGE=american') IN ('FRIDAY', 'SATURDAY', 'SUNDAY')
Спасибо за Ваш ответ! Вы правы, поскольку SELECT '<' || TO_CHAR (DATE '2018-05-07', 'DAY') || '>' из двойного; возвращает <ПОНЕДЕЛЬНИК>
Случай выражение, а не инструкция.